例子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__':
    = Inventory() #创建仓库对象
    = ConsoleObserver(i) #创建一个观察者对象,并将仓库对象作为初始化参数
    i.attach(c) #将观察者对象添加到仓库对象中的observers列表里(两个对象之间的交互)
    i.product = "Widget" #仓库对象设置产品名称(有发生改动)
    i.quantity = 5 #仓库对象设置产品数量(有发生改动)
    '''
    工作流分析:
        1、首先增加了一个产品名称,因此通知观察者打印,此时打印出了新添加的产品名称,数量默认为0
        2、之后,又增加了数量5,那么又通知了观察者,此时打印出了之前添加的产品名称和这一次新增加的数量5
    '''

本文转自 TtrToby 51CTO博客,原文链接:http://blog.51cto.com/freshair/2068926

Python设计模式——观察者模式相关推荐

  1. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  2. python 设计模式 观察者模式(发布订阅模式)

    发布订阅模式 观察者模式应用比较广泛,又被称为"发布-订阅"模式.它用来定义对象间一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新. 问题1 ...

  3. 大话设计模式Python实现-观察者模式

    观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更 ...

  4. python 设计模式 观察者_python设计模式之观察者模式

    说到观察者模式,在我脑海中总是闪现,这家伙跟消息队列的主题发布订阅有什么关系,虽然本人对消息队列没有很深的研究,但是凭直觉我就认为消息队列的实现就使用了观察者模式吧,所以本文就来模拟消息队列的丐版实现 ...

  5. 精通python设计模式-精通Python设计模式

    精通python设计模式2016年7月由人民邮电出版社出版发行,是一本学习Python设计模式方面的优秀指导教材.软件工程中,设计模式是指软件设计问题的推荐方案.设计模式一般是描述如何组织代码和使用最 ...

  6. python设计模式pdf_精通Python设计模式 高清晰PDF+源码

    精通Python设计模式讲述了16种基本设计模式,轻松解决软件设计常见问题:借力高效的Python语言,用现实例子展示各模式关键特性. 本书用实际生活中的例子带你了解常用的设计模式,介绍了诸多有关编写 ...

  7. python设计模式之模板模式

    python设计模式之观察者模式 有时,我们希望在一个对象的状态改变时更新另外一组对象.在MVC模式中有这样一个非 常常见的例子,假设在两个视图(例如,一个饼图和一个电子表格)中使用同一个模型的数据, ...

  8. python设计模式【8】-模型·视图·控制器-复合模式

    UML类图简介 设计模式的分类 面向对象的设计原则 python设计模式[1]-单例模式 python设计模式[2]-工厂模式 python设计模式[3]-门面模式 python设计模式[4]-代理模 ...

  9. python设计模式【7】-模板方法模式

    UML类图简介 设计模式的分类 面向对象的设计原则 python设计模式[1]-单例模式 python设计模式[2]-工厂模式 python设计模式[3]-门面模式 python设计模式[4]-代理模 ...

最新文章

  1. pom.xml中的常用依赖包总结
  2. 破解xp(sp2)密码
  3. 国家开放大学2021春1044合同法题目
  4. python 嵌入 php,Python与PHP实现插入排序实例
  5. 女朋友学高数,我花了 15 分钟用栈给她写了一个计算器 | 原力计划
  6. [CIFS]解决linux挂载CIFS提示 HOST is down
  7. Java获取resin端口_线上解决Resin服务响应过慢的几个方法
  8. wordpresd免登录发布接口php_实现wordpress的ajax接口请求学会admin-ajax.php的利用
  9. iOS 逆向编程(二)越狱入门知识
  10. 【测试管理】版本定义
  11. fluent p1模型_FLUENT基本物理模型介绍
  12. 伦敦时间现在几点_英国伦敦现在时间是几点
  13. 乐蜂网八周年店庆有感
  14. brew mysql_brew mysql指定版本
  15. 用python进行数据分析(一:数据理解)
  16. 苹果电脑安装双系统Mac和Win7,详细教程
  17. Python开源项目合集(网页框架)
  18. c语言函数的标准写法,C语言函数的两种写法变种
  19. 小米设备跨版本降级后相机打不开陀螺仪无法工作解决办法
  20. linux 没有可用软件包,Linux中“没有可用的软件包XX,但是它被其他软件包引用”的解决方法...

热门文章

  1. jQuery插件推荐(一) ——图像切换展示
  2. Graphpad Prism作相关性分析图
  3. 解决浏览器下载excel文件时显示“文件已损坏”
  4. 原创:pta做题笔记:注意数组大小大一点!//准考证号,试机座位,考试座位查询
  5. 机器人学习--AMCL导航包自己修改源码编译和调用方法
  6. 新手小白零基础搭建个人博客(一)服务器篇
  7. 计算机一级单元格公式设置错误是什么原因,excel表格公式出错怎么解决,电子表格求和出错...
  8. 小米手环五怎么和微信连接不上服务器,小米手环怎么连接手机微信
  9. 无人机是计算机什么方面的应用,无人机测绘可以应用到哪些方面呢?
  10. wps如何自己制作流程图_自己如何制作APP软件