2014-12-16 17 views
8

Nói rằng tôi có một loại rất đơn giản dữ liệu:Có thể giám sát danh sách (hoặc chuỗi có thể thay đổi) khi nào một thành viên của danh sách được sửa đổi không?

class SimpleObject: 
    def __init__(self, property): 
     self.property = property 

    def update_property(self, value): 
     self.property = value 

Và tôi một loại đặc biệt của danh sách để lưu trữ các kiểu dữ liệu:

class SimpleList(collections.MutableSequence): 
    def update_useful_property_of_list(self, value): 
     self.useful_property_of_list = value 

Và tôi lưu trữ chúng:

simple1 = SimpleObject(1) 
simple2 = SimpleObject(2) 

simple_list = SimpleList([simple1, simple2]) 

Có cách nào để đối tượng SimpleList biết khi một trong các thuộc tính của các thành viên của nó thay đổi không? Ví dụ, làm thế nào tôi có thể nhận simple_list để thực hiện self.update_useful_property_of_list() khi một cái gì đó như thế này xảy ra:

simple1.update_property(3) 
+0

Tôi nhớ lại các trang trí chức năng là một cách để xử lý việc này. Đó có thể là một hướng để xem xét. – BlackVegetable

+4

Đó là * mẫu thiết kế quan sát *, bạn có thể dễ dàng tìm thấy các nguồn về nó bằng cách tìm kiếm nhanh. – utdemir

+0

bạn muốn làm gì? –

Trả lời

4

Như đã đề cập trong các ý kiến, bạn đang tìm kiếm các Observer design pattern. Đơn giản nhất, cách để làm điều đó trong ví dụ của bạn:

class SimpleObject: 
    def __init__(self, property, propertyChangeObserver = None): 
     self.property = property 
     self.propertyChangeObserver = propertyChangeObserver 

    def registerPropertyChangeObserver(self, propertyChangeObserver): 
     self.propertyChangeObserver = propertyChangeObserver 

    def update_property(self, value): 
     self.property = value 
     if self.propertyChangeObserver: 
      self.propertyChangeObserver.simpleObjectPropertyChanged(self) 

và:

class SimpleList(collections.MutableSequence): 
    def __init__(self, collection): 
     super(SimpleList, self).__init__(collection) 
     for e in collection: 
      e.registerPropertyChangeObserver(self) 

    def simpleObjectPropertyChanged(self, simpleObject): 
     pass # react to simpleObject.property being changed 

Bởi vì bạn đã gọi tài sản của bạn "sở hữu" thật khó để chứng minh thấp khớp nối ở đây :) Tôi đã gọi là phương pháp simpleObjectPropertyChanged để rõ ràng, nhưng trên thực tế, SimpleList không phải biết rằng nó lưu trữ SimpleObject trường hợp - nó chỉ cần biết rằng chúng là quan sát được trường hợp. Theo cách tương tự, SimpleObject không biết về SimpleList - nó chỉ biết về một số lớp cần phải quan sát trạng thái của nó (một người quan sát - do đó tên của mẫu đó).

Các vấn đề liên quan