python设计模式观察者模式observe
- 观察者模式是一个软件设计模式,一个主题对象博包涵一系列依赖他的观察者,自动通知观察者的主题对象的改变,通常会调用每个观察者的一个方法。这个设计模式非常适用于分布式事件处理系统。
- 典型的在观察者模式下:
- 1.发布者类应该包涵如下方法:
- 注册能够接收通知的对象
- 从主对象到注册对象,通知任何变化
- 未注册对象不能够接收任何通知信息
- 2.订购者类应该包涵如下:
- 发布者会调用一个订购者提供的方法,将任何改变告知注册对象。
- 3.当一个事件会触发了状态的改变,发表者会调用通知方法
- 1.发布者类应该包涵如下方法:
- 总结:订阅者可以在发布对象中注册或者不注册,如此无论什么事件发生,都会触发发布者通过调用通知方法,去通知订购者。这个通知只会在事件发生的时候,去通知已经注册的订购者。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/6/15 23:21
# @Author : liMyheart
# @Site :
# @File : armySentinel.py
# @Software: PyCharm
class ObserveBase(object):
'''
观察者基类
'''
def __init__(self):
# 被观察对象列表
self._obverse_list = []
def attach(self, observe_obj):
'''
添加要观察者对象
:param observe_obj: 被观察者对象
:return:
'''
if observe_obj not in self._obverse_list:
self._obverse_list.append(observe_obj)
print("{}已经将{}加入观察者队列...".format(self.name, observe_obj))
def detach(self, observe_obj):
'''
删除观察对象
:param observe_obj: 被观察对象
:return:
'''
try:
self._obverse_list.remove(observe_obj)
print("{}已经将{}移除观察者队列...".format(self.name, observe_obj))
except Exception as e:
pass
def notify(self):
'''
通知对象
:return:
'''
for obj in self._obverse_list:
obj.update(self)
class Observe(ObserveBase):
'''
观察者类
'''
def __init__(self, name):
# 继承基类方法
super().__init__()
self.name = name
self._msg = ''
@property
def msg(self):
'''
消息
:return:
'''
return self._msg
@msg.setter
def msg(self, msg):
self._msg = msg
self.notify()
class Communists(object):
'''
共军被观察者
'''
def __init__(self):
pass
def update(self, observe_obj):
print("共军:收到[{}]消息[{}]".format(observe_obj.name, observe_obj.msg))
class Military():
'''
国军被观察者
'''
def __init__(self):
pass
def update(self, observe_obj):
print("国军:收到[{}]小心[{}]".format(observe_obj.name, observe_obj.msg))
if __name__ == '__main__':
# 实例化放哨者
observeC = Observe("共军放哨者")
observeM = Observe("国军放哨者")
# 实例化军队对象
Carmy = Communists()
Marmy = Military()
# 共军将共军和国军对象添加到观察者队列
observeC.attach(Carmy)
observeC.attach(Marmy)
# 国军只是将国军添加到观察者队列
observeM.attach(Marmy)
# 传入消息
# \033[32;1m敌人来了...\033[0m print颜色输出格式
observeC.msg = "\033[32;1m敌人来了...\033[0m"
observeM.msg = "\033[31;1m发现敌人,请紧急撤离,不要告诉共军\033[0m"
- 打印
共军放哨者已经将<__main__.Communists object at 0x000002A5ED1A55F8>加入观察者队列...
共军放哨者已经将<__main__.Military object at 0x000002A5ED1A5978>加入观察者队列...
国军放哨者已经将<__main__.Military object at 0x000002A5ED1A5978>加入观察者队列...
共军:收到[共军放哨者]消息[敌人来了...]
国军:收到[共军放哨者]小心[敌人来了...]
国军:收到[国军放哨者]小心[发现敌人,请紧急撤离,不要告诉共军]

版权声明:本文为weixin_42337937原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。