自助购物网站怎么做,视觉设计网站建设,微网站 举例,管理系统开发观察者模式
单个对此#xff08;发布者#xff0c;也称为主体或是可观察对象#xff09;和一个或是多个对象#xff08;订阅者#xff0c;也称为观察者#xff09;之间的发布-订阅关系。增加发布者和订阅这个之间解耦#xff0c;使得在运行时添加、删除订阅者变得容易。…观察者模式
单个对此发布者也称为主体或是可观察对象和一个或是多个对象订阅者也称为观察者之间的发布-订阅关系。增加发布者和订阅这个之间解耦使得在运行时添加、删除订阅者变得容易。对于MVC, 发布者是模型订阅者是视图。
拍卖场景
每个竞买人都有一个号码牌当天安门想要出价时就举起号码牌。当竞买人举起牌子时拍卖人即为主体更新竞买价格并将新价格广播给所有竞买人竞买者。
软件场景
RabbitMQ 库可以用于应用程序添加异步消息支持支持多种消息协议http和amqp 。RbbitMQ 可以在Python 应用与发布订阅模式该模式就是观察者设计模式。
新闻流
使用RSS 、Atom 或其他相关格式。可以关注一个新闻流每次更新时候你都会收到一个关于更新的通知。
事件驱动系统
监听器监听特定的事件监听器在监听的事件被创建时触发。这个事件可以是按下一个特定的键移动鼠标事件扮演发布者的角色监听器扮演观察者的角色。可以为单个事件发布者添加多个监听器观察者。
案例
格式化程序有一个默认的格式化程序以十进制格式显示一个值可以添加、注册更多的格式化程序。每次更新默认的格式化程序时候都会通知已经注册的格式化程序采取行动。程序以相关格式显示新的值。
(1) 定义 Publisher 类。
(2) 定义 DefaultFormatter 类以及特殊的 __init__ 和 __str__ 方法。
(3) 向 DefaultFormatter 类添加 data 属性的设置方法和获取方法。
(4) 定义两个观察者类
(5) 添加程序的主体部分。 main() 函数的第一部分如下。 class Publisher:def __init__(self):self.observers [] # 保存观察者def add(self, observer):if observer not in self.observers:self.observers.append(observer)else:print(fFailed to add:{observer})def remove(self, observer):try:self.observers.remove(observer)except ValueError:print(fFailed to remove:{observer})def notify(self):print(所有观察者通知更新)[o.notify(self) for o in self.observers]class DefaultFormatter(Publisher):def __init__(self, name):Publisher.__init__(self)self.name nameself._data 0def __str__(self):return f{type(self).__name__}:{self.name} has data {self._data}propertydef data(self):return self._datadata.setterdef data(self, new_value):try:self._data int(new_value)except ValueError as e:print(fError:{e})else:self.notify() # 执行通知定义两个观察者
class HexFormatterObs:def notify(self, publisher):value hex(publisher.data)print(f{type(self).__name__}: {publisher.data} has now hex data {value})class BinaryFormatterObs:def notify(self, publisher):value bin(publisher.data)print(f{type(self).__name__}:{publisher.data} has now bin data {value})def main():dfDefaultFormatter(test1)print(df)print(---------------------)hfHexFormatterObs()df.add(hf)df.data3print(df)bfBinaryFormatterObs()df.add(bf)df.data21print(df)print(----------hello-----------)df.datahelloprint(df)print(----------15.8-----------)df.data15.8print(df)
if __name__ __main__:main()# try:# print(33333)# except:# print(wwww)# else:# print(else)
执行结果
DefaultFormatter:test1 has data 0
---------------------
所有观察者通知更新
HexFormatterObs: 3 has now hex data 0x3
DefaultFormatter:test1 has data 3
所有观察者通知更新
HexFormatterObs: 21 has now hex data 0x15
BinaryFormatterObs:21 has now bin data 0b10101
DefaultFormatter:test1 has data 21
----------hello-----------
Error:invalid literal for int() with base 10: hello
DefaultFormatter:test1 has data 21
----------15.8-----------
所有观察者通知更新
HexFormatterObs: 15 has now hex data 0xf
BinaryFormatterObs:15 has now bin data 0b1111
DefaultFormatter:test1 has data 15