观察者模式

观察模式

  • 内容

    定义对象中的一对多的依赖关系,当一个对象的状态发生改变。所有依赖于他的对象都得到通知并被自动更新,又被称为“发布-订阅”关系

  • 角色

    1. 抽象主题
    2. 具体主题
    3. 抽象观察者
    4. 具体观察者
  • 使用场景

    1. 当一个抽象模型两方面,其中一个方面依赖另一个方面,将这两个封装在一个独立的对象中,可以使他们各自改变和复用
    2. 当一个对象的改变需要改变其他对象的时候,而不知道具体有多少对象带改变
    3. 当一个对象必须通知其他对象,而他又不能假定其他对象是谁(不希望这些对象是紧密耦合的
  • 优点

    1. 目标和观察者之间耦合最小
    2. 支持广播通信
  • 代码实例

    from abc import ABCMeta,abstractmethod
    
    # 观察者(订阅者)
    class ObServer(metaclass=ABCMeta):
    	@abstractmethod
    	def update(self,notice):
    		pass
    
    # 发布者
    class  Notice(object):
    	"""dcstring for  notice"""
    	def __init__(self, *arg,**kwargs):
    		self.ObServers = []   # 列表里面的对象应该是ObServer类
    
    	def attah(self,ObServer):
    		self.ObServers.append(ObServer)
     
    	def pepth(self,ObServer):
    		self.ObServers.remove(ObServer)
    
    	def notify(self):
    		for obs in self.ObServers:
    			obs.update()
    
    
     # 发布者实例
    class StaffNotice(Notice):
    	"""docstring for StaffNotie"""
    	def __init__(self,company_info,*args,**kwargs):
    		super().__init__(args,kwargs)
    		self.__company_info = company_info
    
    
    	@property
    	def show_company_info(self):
    		return self.__company_info
    	
    	@show_company_info.setter
    	def show_company_info(self,company_info):
    		self.__company_info = company_info
    		self.notify()
    
    
    # 观察者实例
    class Staff(ObServer):
    	"""docstring for Staff"""
    	def __init__(self):
    		self.company_info = None
    
    	def update(self,notice):
    		self.company_info = notice.show_company_info 
    		return self.company_info
    
    staff = StaffNotice('正在初始化公司')
    staff.show_company_info = '阿里巴巴'
    s1 = Staff()
    s2 = Staff()
    staff.attah(s1)
    staff.attah(s2)
    print(s1.update(staff))
    print(s2.update(staff))
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值