观察者模式就是根据某一对象的状态变化自动更新与它相关的对象的状态。git
一. demo演示github
如下是我本身实现观察者模式的一个demo。数据库
被观察者:django
Plant: 当植物的状态变动时,会通知观察者。植物的初始状态是“new”。app
观察者:框架
Worker: 若是植物的状态是“ill”,园丁就须要工做;不然什么也不作。函数
Eater: 若是植物的状态是“ok”,吃货就会吃掉植物;不然什么也不作。网站
1 class Observer(object): 2 """观察者的接口""" 3 4 def update(self): 5 return 6 7 def display(self): 8 return 9 10 class Observed(object): 11 """被观察者的接口""" 12 13 def registerObserver(self): 14 return 15 16 def removeObserver(self): 17 return 18 19 def notifyObserver(self): 20 return 21 22 def display(self): 23 return 24 25 class Plant(Observed): 26 """植物类:实现了被观察者接口""" 27 28 def __init__(self, name): # 初始化 29 self.observers = [] 30 self.status = 'new' 31 self.name = name 32 33 def registerObserver(self, observer): # 添加观察者 34 if observer not in self.observers: 35 self.observers.append(observer) 36 else: 37 print("Fail to register this observer!") 38 39 def removeObserver(self, observer): # 移除观察者 40 if observer not in self.observers: 41 self.observers.remove(observer) 42 else: 43 print("Fail to remove this observer!") 44 45 def notifyObserver(self): # 通知观察者状态变化了 46 for o in self.observers: 47 o.update(self.status) 48 49 def display(self): # 输出被观察者的状态 50 print("this is a %s tree, and its status is %s" %(self.name, self.status)) 51 52 def setStatus(self, status): # 设置被观察者的状态 53 if self.status == status: 54 return 55 else: 56 self.status = status 57 self.notifyObserver() 58 59 class Worker(Observer): 60 """园丁类:负责维护植物,实现了观察者接口""" 61 62 def __init__(self, plant): 63 self.plant = plant 64 self.doing = "nothing" 65 plant.registerObserver(self) 66 67 def update(self, status): # 根据观察者反馈更新本身的状态 68 if status=="ill": 69 self.doing = "work" 70 else: 71 self.doing = "nothing" 72 73 def display(self): # 展现 74 print("I am a planter, my plant is %s and i doing %s" %(self.plant.status, self.doing)) 75 76 class Eater(Observer): 77 """吃货:负责吃掉植物,实现啦观察者接口""" 78 79 def __init__(self, plant): 80 self.plant = plant 81 self.doing = "nothing" 82 plant.registerObserver(self) 83 84 def update(self, status): # 根据观察者反馈更新本身的状态 85 if status=="ok": 86 self.doing = "work" 87 else: 88 self.doing = "nothing" 89 90 def display(self): # 展现 91 print("I am a eater, my plant is %s and i doing %s" %(self.plant.status, self.doing)) 92 93 def main(): 94 apple = Plant("apple") 95 worker = Worker(apple) 96 eater = Eater(apple) 97 apple.display() 98 worker.display() 99 eater.display() 100 print() 101 102 apple.setStatus("ok") 103 apple.display() 104 worker.display() 105 eater.display() 106 print() 107 108 apple.setStatus("ill") 109 apple.display() 110 worker.display() 111 eater.display() 112 print() 113 114 main()
二. Djangothis
Django是一个开放源代码的Web应用框架,由Python写成。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。在Django中Python被广泛使用,甚至包括配置文件和数据模型。spa
与观察者模式相关的主要是其中的Django中的信号系统。
当某一事件发生时,信号系统能够容许一个或多个发送者(senders)将通知或信号(signals)推送给一组接受者(receivers)。
在这里,
发送者--被观察者,即发送信号的对象
信号--变化的状态信息
接受者--观察者,接受信号并对其做出响应
咱们先建立一个信号,providing_args是该信号具备的参数
import django.dispatch status = django.dispatch.Signal(providing_args=['status'])
指定被观察者,sender是被观察者,status是信号的信息
status.send(sender=None, status=None)
指定观察者并进行监听,receiver是观察者
status.connect(receiver=function)
最后实现回调函数function,在这里面实现观察者的响应函数
def function(params): # 实现响应 ...
观察者模式的好处: