观察者模式在Django中的运用

观察者模式就是根据某一对象的状态变化自动更新与它相关的对象的状态。

一. demo演示

以下是我自己实现观察者模式的一个demo。

被观察者:

  Plant: 当植物的状态变更时,会通知观察者。植物的初始状态是“new”。

观察者:

  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()

 

二. Django

Django是一个开放源代码的Web应用框架,由Python写成。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。

与观察者模式相关的主要是其中的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. 观察者模式满足开闭原则的要求。增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下。增加新的观察者目标也很方便。

猜你喜欢

转载自www.cnblogs.com/zjj2018/p/9799879.html
今日推荐