Python设计模式行为型观察者模式
作者:范桂飓 发布时间:2022-02-20 12:32:58
标签:Python,设计模式,观察者模式
一、观察者模式
观察者模式,必须包含 “观察者” 和 “被观察者” 这两个角色,并且观察者和被观察者之间存在 “观察” 的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。例如:业务数据是被观察者,用户界面是观察者。
实际上,观察者模式大部分都是一对多的关系,可以多个观察者对象同时观察某一个被观察对象。
观察者模式的实现思路是:核心的抽象类用于管理所有依赖它的其他类,当核心类发生变动时,主动通知并更新其他类。
二、应用场景
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
需要在系统中创建一个触发链,A 对象的行为将影响 B 对象,B 对象的行为将影响 C 对象,…。可以使用观察者模式创建一种链式触发机制。
三、代码示例
当客户的数量减少到阀值时,销售将通知工厂减少生产量、同时通知人力资源开始裁员,反之则增加。
class Observer:
"""观察者核心类,销售人员"""
def __init__(self):
self._number = None
self._department = []
@property
def number(self):
return self._number
@number.setter
def number(self, value):
self._number = value
print('当前客户数:{}'.format(self._number))
for obj in self._department:
obj.change(value)
print('------------------')
def notice(self, department):
"""相关部门"""
self._department.append(department)
class Hr:
"""观察者类,人事部门"""
def change(self, value):
if value < 10:
print("人事变动:裁员")
elif value > 20:
print("人事变动:扩员")
else:
print("人事不受影响")
class Factory:
"""观察者类,工厂类"""
def change(self, value):
if value < 15:
print("生产计划变动:减产")
elif value > 25:
print("生产计划变动:增产")
else:
print("生产计划保持不变")
if __name__ == '__main__':
observer = Observer()
hr = Hr()
factory = Factory()
observer.notice(hr)
observer.notice(factory)
observer.number = 10
observer.number = 15
observer.number = 20
observer.number = 25
来源:https://is-cloud.blog.csdn.net/article/details/122933840


猜你喜欢
- 在网页设计初期,我们会先收集大家对设计方向的期许,我们经常收集到这样的建议:产品经理:要易用,要简洁设计总监:要特色,要亮点部门经理:要大气
- 数组是一种有序的集合,可随时添加、删除其中的元素book = ['xiao zhu pei qi','xiao ji
- 请问论坛的树状记录表是怎么展开的?如何做?论坛的这种展开技术一般采用两种方法实现,一种是采用递归的方法,优点是逻辑简单,编程简单,缺点是速度
- //by zdzhuo <html> <head> <script type=
- 记得从ymPrompt2.0的时候自己就遇到过在IE下有时会莫名其妙的提示“无法打开Internet站点 已终止操作”,这样的一个错误很让人
- 项目开始时是一个关键时刻,选择会对项目产生长期的影响。有很多关于如何开始使用Django框架的教程,但很少讨论如何专业地使用Django,或
- 官方文档https://developers.weixin.qq.com/miniprogram/dev/framework/open-ab
- 如下所示:data = np.random.randn(20)factor = pd.cut(data,4)pd.get_dummies(f
- 在腾讯的微信公众平台开发者文档,网页授权获取用户基本信息这一节中写道”在微信公众号请求用户网页授权之前,开发者需要先到公众平台网站的我的服务
- Python 的 openpyxl 模块可以让我们能读取和修改 Excel 文件。首先让我们先理解一些 Excel 基础概念。1 Excel
- import matplotlib.pyplot as plt #plt用于显示图片import matplotlib.image as m
- 在进行单个爬虫抓取的时候,我们不可能按照一次抓取一个url的方式进行网页抓取,这样效率低,也浪费了cpu的资源。目前python上面进行并发
- 以下各种方式仅供参考,本人亲测只有官方提供的方式比较靠谱。1. 使用多个进程启动多个Tornado实例import tornado.http
- 如下所示:from sklearn.datasets import load_bostonboston = load_boston()fro
- 先把要恢复的文件置于MS SQL里的DATA文件里,进入MS SQL主数据库服务器。 1.我们使用默认方式建立一个供恢复
- 1. 功能说明,在页面使用smarty循环100次输出,类似for循环100次{section name=total loop=100}{$
- 零、SQLAlchemy是什么?SQLAlchemy的官网上写着它的介绍文字:SQLAlchemy is the Python SQL to
- 生活中,我们在登录微博,邮箱的时候,常常会碰到验证码。在工作时,如果想要爬取一些数据,也会碰到验证码的阻碍。本次试验将带领大家认识验证码的一
- 在 AbpBase.Database 中,通过 Nuget 添加以下几个库:版本都是 1.9.0-preview0917
- 快速高效用:SET SQL_SAFE_UPDATES = 0;下面的就不要看了!今日用MySQL Workbench进行数据库的管理更新时,