设计模式-观察者模式

设计模式之观察者模式

1. 什么是观察者模式?
监听者模式是一种一对多的关系,可以有任意一个或多个观察者对象同时监听某一个对象,监听的对象叫观察者,被监听的对象叫被观察者,
被观察者的状态或内容发送改变的时候,会通知所有的观察者对象,使他们做出相对应的变化。
2.注意事项
要明白谁是观察者,谁是被观察者。只要明白了他们之间的关系,编码也就很好编写了。
3.优缺点:
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点: 
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
4.UMI图

在这里插入图片描述

5.代码
from abc import ABCMeta,abstractclassmethod

class Observer(metaclass=ABCMeta):
    
    # 观察者的基类
    @abstractclassmethod
    def update(self):
        pass
    
    
class Observable():
    # 抽象被观察者
    
    
    def __init__(self):
        self._observables = []
        
    
    def set_observables(self):
        self.notifyallobservable() 
    
    def add_observables(self,observable):
        self._observables.append(observable)
        
    def remove_observable(self,observable):
        self._observables.remove(observable)
    
    def notifyallobservable(self):
        pass
            


class ConcreteObservable(Observable):
    
    def __init__(self,a):
        super().__init__()
        self.a = a
        
    def notifyallobservable(self):
        if self.a in [1,2]:
            for _ in self._observables:
                _.update()
            
class Subscribe1(Observer):

    
    def update(self):
        print("具体观察者 当背观察者发送改变的时候做出响应")
        
class Subscribe2(Observer):
    
        
    def update(self):
        print("具体观察者 当背观察者发送改变的时候做出响应")
        
    
class ObserverPattern():
    
    def __init__(self,a):
        self.a = a
    
    def run(self):
        observable = ConcreteObservable(self.a )
        subscribe1 = Subscribe1()
        subscribe2 = Subscribe2()
        observable.add_observables(subscribe1)
        observable.add_observables(subscribe2)
        observable.notifyallobservable()
        
if __name__ == "__main__":
    ObserverPattern(1).run()
    ObserverPattern(3).run()
        
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值