观察者模式在Django中的运用

观察者模式就是根据某一对象的状态变化自动更新与它相关的对象的状态。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中的信号系统。

github连接:https://github.com/django/django/blob/c53af5661313079d022553b6c775e6c4f8d34927/django/dispatch/dispatcher.py#L19

当某一事件发生时,信号系统能够容许一个或多个发送者(senders)将通知或信号(signals)推送给一组接受者(receivers)。

在这里,

  发送者--被观察者,即发送信号的对象

  信号--变化的状态信息

  接受者--观察者,接受信号并对其做出响应

咱们先建立一个信号,providing_args是该信号具备的参数

import django.dispatch status = django.dispatch.Signal(providing_args=['status'])

指定被观察者,sender是被观察者,status是信号的信息

status.send(sender=None, status=None)

指定观察者并进行监听receiver是观察者

https://github.com/django/django/blob/c53af5661313079d022553b6c775e6c4f8d34927/django/dispatch/dispatcher.py#L49

status.connect(receiver=function)

最后实现回调函数function,在这里面实现观察者的响应函数

def function(params): # 实现响应 ...

 观察者模式的好处:

1. 观察者模式能够实现表示层和数据逻辑层的分离,定义稳定消息更新传递机制,并抽象更新接口。
2. 观察者模式的观察目标和观察者之间创建一种抽象的耦合。观察者目标只须要维持一个抽象观察者的集合,无须了解其具体观察者。
3. 观察者模式支持广播通讯,观察目标会向全部已注册的观察者对象发送通知,简化一对多系统设计难度。
4. 观察者模式知足开闭原则的要求。增长新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的状况下。增长新的观察者目标也很方便。
相关文章
相关标签/搜索