如果你理解了,它可以用于各种场景,如果你不理解,什么场景也用不了,所以重点在于理解,尝试去用。
直接上代码
# 例如:一个个奸细同时在监视小明,在他的身上安装的定位 class Person(object): # 被监视者 def __init__(self): self._observerlist = [] # 核心是记录观察者id def attach(self, observer): #被偷偷安装监视器 self._observerlist.append(observer) def detach(self, observer): #去除监视器 self._observerlist.remove(observer) def notify(self, location): for obs in self._observerlist: obs.update(location) # 调用观察者的方法 class Observer(object): # 观察者 def update(self, message): print("get infomation: ",message) if __name__ == "__main__": observer = Observer() # 来了一个监视人员 xiaoming = Person() # 被监视者小明童鞋 xiaoming.attach(observer) # 观察者注册,小明被监视 xiaoming.notify("go to beijing") # 小明准备去北京,被监视者刺探到情报
一个东西被一堆东西围着,这种场景很多,都可以用观察者模式,如注册,监听等
观察者模式又叫发布-订阅模式
class Publisher: # 发布者 def __init__(self): pass def register(self): pass def unregister(self): pass def notifyAll(self): pass class TechForum(Publisher): # 被观察对象 def __init__(self): self._listOfUsers = [] self.postname = None def register(self, userObj): if userObj not in self._listOfUsers: self._listOfUsers.append(userObj) def unregister(self, userObj): self._listOfUsers.remove(userObj) def notifyAll(self): for objects in self._listOfUsers: objects.notify(self.postname) def writeNewPost(self , postname): # 被观察者通知观察者额外的信息 self.postname = postname self.notifyAll() class Subscriber: def __init__(self): pass def notify(self): pass class User1(Subscriber): # 观察者1 def notify(self, postname): print"User1 notified of a new post %s" % postname class User2(Subscriber): # 观察者2 def notify(self, postname): print"User2 notified of a new post %s" % postname class SisterSites(Subscriber): def __init__(self): self._sisterWebsites = ["Site1" , "Site2", "Site3"] def notify(self, postname): for site in self._sisterWebsites: print"Send nofication to site:%s " % site if __name__ == "__main__": techForum = TechForum() # 被观察对象 user1 = User1() # 监视者1号 user2 = User2() # 监视者2号 sites = SisterSites() # 监视者头目 techForum.register(user1) # 被3人监视 techForum.register(user2) techForum.register(sites) techForum.writeNewPost("Observe Pattern in Python") # 放烟雾弹 # techForum.unregister(user2) # 干掉2号 techForum.writeNewPost("MVC Pattern in Python")
这里还加入了工厂模式。
所以理解了,随便用