观察者

观察者模式号称是其他设计模式之母,所以可以看出其地位的重要。观察者模式主要用于定义对象间的一对多关系,当一个对象的状态发生变化时,其他所有对其依赖的对象都将获得通知并自动更新。观察者模式可以演变出许多常见的设计模式,例如生产-消费模式等。

以下给出一个观察者模式的示例。

class Subject:
	def __init__(self):
		self._observers = []
	
	def attach(self, observer):
		if not observer in self._observers:
			self._observers.append(observer)
	
	def detach(self, observer):
		try:
			self._observers.remove(observer)
		except ValueError:
			pass
	
	def notify(self, modifier=None):
		for observer in self._observers:
			if modifier != observer:
				observer.update(self)


class Data(Subject):
	def __init__(self, name=""):
		Subject.__init__(self)
		self.name = name
		self._data = 0
		
	@property
	def data(self):
		return self._data
	
	@data.setter
	def data(self, value):
		self._data = value
		self.notify()


class Viewer1:
	def update(self, subject):
		print("In view 1: {0}".format(subject.data))
	

class Viewer2:
	def update(self, subject):
		print("In view 2: {0}".format(subject.data))


def main():
	data1 = Data('Data 1')
	view1 = Viewer1()
	view2 = Viewer2()
	data1.attach(view1)
	data1.attach(view2)
	
	data1.data = 10
	data1.data = 15