drs*_*drs 8 python list mutable sequence observer-pattern
假设我有一个非常简单的数据类型:
class SimpleObject:
def __init__(self, property):
self.property = property
def update_property(self, value):
self.property = value
Run Code Online (Sandbox Code Playgroud)
我是一种特殊的列表来存储数据类型:
class SimpleList(collections.MutableSequence):
def update_useful_property_of_list(self, value):
self.useful_property_of_list = value
Run Code Online (Sandbox Code Playgroud)
我存储它们:
simple1 = SimpleObject(1)
simple2 = SimpleObject(2)
simple_list = SimpleList([simple1, simple2])
Run Code Online (Sandbox Code Playgroud)
有没有办法让SimpleList对象知道其成员的某个属性何时发生变化?例如,当这样的事情发生时,我怎样才能simple_list执行self.update_useful_property_of_list():
simple1.update_property(3)
Run Code Online (Sandbox Code Playgroud)
正如评论中所述,您正在寻找观察者设计模式。在您的示例中最简单的方法是:
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)
Run Code Online (Sandbox Code Playgroud)
和:
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
Run Code Online (Sandbox Code Playgroud)
因为您将您的属性称为“属性”,所以很难在这里展示低耦合:)simpleObjectPropertyChanged为了清楚起见,我已经调用了该方法,但实际上,SimpleList不必知道它存储SimpleObject实例 - 它只需要知道它们是可观察的实例。以类似的方式,SimpleObject不知道SimpleList- 它只知道一些需要观察其状态的类(观察者- 因此模式的名称)。