Python设计模式——观察者模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python设计模式——观察者模式相关的知识,希望对你有一定的参考价值。
例子1:
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:
#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设计模式——观察者模式的主要内容,如果未能解决你的问题,请参考以下文章