python观察者模式 多线程_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

'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值