Python设计模式——观察者模式
例子1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
class Service:
def __init__( self , service_name, process_name, port, enable_monitor = None ):
self .service_name = service_name
self .process_name = process_name
self .port = port
self .mon = enable_monitor
self ._process_status = True
self ._port_status = True
@ property
def process_status( self ):
return self ._process_status
@process_status.setter
def process_status( self , status):
self ._process_status = status
self .mon.start_mon()
@ property
def port_status( self ):
return self ._port_status
@port_status.setter
def port_status( self , status):
self ._port_status = status
self .mon.start_mon()
class Action:
@ classmethod
def send_sms_alarm( cls , content):
print ( "SMS Alarm: {}" . format (content))
@ classmethod
def send_email_alarm( cls , content):
print ( "Email Alarm: {}" . format (content))
class Monitor:
def __init__( self ):
self .services = []
def add_service( self , service):
self .services.append(service)
def start_mon( self ):
for ser in self .services:
if not ser.process_status:
Action.send_email_alarm( "Service: {0} Process: {1} Status: {2}" . format (
ser.service_name, ser.process_name, ser.process_status))
if not ser.port_status:
Action.send_email_alarm( "Service: {0} Process: {1} Status: {2}" . format (
ser.service_name, ser.port, ser.port_status))
if __name__ = = '__main__' :
mon = Monitor()
http = Service( "http" , "httpd" , 80 , mon)
mysql = Service( "mysql" , "mysqld" , 3306 , mon)
zabbix = Service( "zabbix" , "zabbixd" , 1501 , mon)
mon.add_service(http)
mon.add_service(mysql)
mon.add_service(zabbix)
#mon.start_mon()
http.port_status = False
|
例子2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#coding:utf-8
#Inventory类描述仓库对象
class Inventory:
def __init__( self ):
self .observers = [] #此列表用于存储观察者对象
self ._product = None #产品
self ._quantity = 0 #数量
def attach( self , observer): #此方法用于将观察者对象添加进列表
self .observers.append(observer)
@ property #使用property装饰器修饰,使方法变成属性
def product( self ):
return self ._product
@product.setter #使用setter修饰product属性使其可以设置值
def product( self , value):
self ._product = value
self ._update_observers() #只要设置了产品的值,就调用 _update_observers方法
@ property #对数量的设置
def quantity( self ):
return self ._quantity
@quantity.setter
def quantity( self , value):
self ._quantity = value
self ._update_observers() #只要设置了数量的值,就调用 _update_observers方法
def _update_observers( self ):
for observer in self .observers: #遍历观察者对象
observer() #直接用()号调用观察者对象,之所以可以直接调用,是因为在ConsoleObserver类中实现了__call__方法
#ConsoleObserver类描述观察者对象
class ConsoleObserver:
def __init__( self , inventory):
self .inventory = inventory
def __call__( self ): #实现__call__方法后可直接可调用,这里的工作是print了产品和数量信息
print ( "product: {0}, quantity: {1}" . format ( self .inventory.product, self .inventory.quantity))
if __name__ = = '__main__' :
i = Inventory() #创建仓库对象
c = ConsoleObserver(i) #创建一个观察者对象,并将仓库对象作为初始化参数
i.attach(c) #将观察者对象添加到仓库对象中的observers列表里(两个对象之间的交互)
i.product = "Widget" #仓库对象设置产品名称(有发生改动)
i.quantity = 5 #仓库对象设置产品数量(有发生改动)
'''
工作流分析:
1、首先增加了一个产品名称,因此通知观察者打印,此时打印出了新添加的产品名称,数量默认为0
2、之后,又增加了数量5,那么又通知了观察者,此时打印出了之前添加的产品名称和这一次新增加的数量5
'''
|
Python设计模式——观察者模式相关推荐
- Python设计模式-观察者模式
Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...
- python 设计模式 观察者模式(发布订阅模式)
发布订阅模式 观察者模式应用比较广泛,又被称为"发布-订阅"模式.它用来定义对象间一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新. 问题1 ...
- 大话设计模式Python实现-观察者模式
观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更 ...
- python 设计模式 观察者_python设计模式之观察者模式
说到观察者模式,在我脑海中总是闪现,这家伙跟消息队列的主题发布订阅有什么关系,虽然本人对消息队列没有很深的研究,但是凭直觉我就认为消息队列的实现就使用了观察者模式吧,所以本文就来模拟消息队列的丐版实现 ...
- 精通python设计模式-精通Python设计模式
精通python设计模式2016年7月由人民邮电出版社出版发行,是一本学习Python设计模式方面的优秀指导教材.软件工程中,设计模式是指软件设计问题的推荐方案.设计模式一般是描述如何组织代码和使用最 ...
- python设计模式pdf_精通Python设计模式 高清晰PDF+源码
精通Python设计模式讲述了16种基本设计模式,轻松解决软件设计常见问题:借力高效的Python语言,用现实例子展示各模式关键特性. 本书用实际生活中的例子带你了解常用的设计模式,介绍了诸多有关编写 ...
- python设计模式之模板模式
python设计模式之观察者模式 有时,我们希望在一个对象的状态改变时更新另外一组对象.在MVC模式中有这样一个非 常常见的例子,假设在两个视图(例如,一个饼图和一个电子表格)中使用同一个模型的数据, ...
- python设计模式【8】-模型·视图·控制器-复合模式
UML类图简介 设计模式的分类 面向对象的设计原则 python设计模式[1]-单例模式 python设计模式[2]-工厂模式 python设计模式[3]-门面模式 python设计模式[4]-代理模 ...
- python设计模式【7】-模板方法模式
UML类图简介 设计模式的分类 面向对象的设计原则 python设计模式[1]-单例模式 python设计模式[2]-工厂模式 python设计模式[3]-门面模式 python设计模式[4]-代理模 ...
最新文章
- pom.xml中的常用依赖包总结
- 破解xp(sp2)密码
- 国家开放大学2021春1044合同法题目
- python 嵌入 php,Python与PHP实现插入排序实例
- 女朋友学高数,我花了 15 分钟用栈给她写了一个计算器 | 原力计划
- [CIFS]解决linux挂载CIFS提示 HOST is down
- Java获取resin端口_线上解决Resin服务响应过慢的几个方法
- wordpresd免登录发布接口php_实现wordpress的ajax接口请求学会admin-ajax.php的利用
- iOS 逆向编程(二)越狱入门知识
- 【测试管理】版本定义
- fluent p1模型_FLUENT基本物理模型介绍
- 伦敦时间现在几点_英国伦敦现在时间是几点
- 乐蜂网八周年店庆有感
- brew mysql_brew mysql指定版本
- 用python进行数据分析(一:数据理解)
- 苹果电脑安装双系统Mac和Win7,详细教程
- Python开源项目合集(网页框架)
- c语言函数的标准写法,C语言函数的两种写法变种
- 小米设备跨版本降级后相机打不开陀螺仪无法工作解决办法
- linux 没有可用软件包,Linux中“没有可用的软件包XX,但是它被其他软件包引用”的解决方法...
热门文章
- jQuery插件推荐(一) ——图像切换展示
- Graphpad Prism作相关性分析图
- 解决浏览器下载excel文件时显示“文件已损坏”
- 原创:pta做题笔记:注意数组大小大一点!//准考证号,试机座位,考试座位查询
- 机器人学习--AMCL导航包自己修改源码编译和调用方法
- 新手小白零基础搭建个人博客(一)服务器篇
- 计算机一级单元格公式设置错误是什么原因,excel表格公式出错怎么解决,电子表格求和出错...
- 小米手环五怎么和微信连接不上服务器,小米手环怎么连接手机微信
- 无人机是计算机什么方面的应用,无人机测绘可以应用到哪些方面呢?
- wps如何自己制作流程图_自己如何制作APP软件