观察者模式(python)

一、模式定义

1.观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

2.观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式

3.观察者模式是一种对象行为型模式

二、模式结构

观察者模式包含如下角色。
1. Subject(目标)
目标又称为主题,它是指被观察的对象。在目标中定义了一个观察者集合,它可以存储任意数量的观察者对象,它提供一个接口来增加和删除观察者对象,同时它定义了的通知方法notify()。目标类可以是接口,也可以是抽象类或实现类。
2.ConcreteSubject(具体目标)
具体目标是目标类的子类,通常它包含经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知。同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。
3. Observer(观察者)
观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。
4. ConcreteObserver(具体观察者)
在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update( )方法。通常在实现时,可以调用具体目标类的attach()方法将自己添加到目标类的观察者集合中或通过detach()方法将自己从目标类的观察者集合中删除。

三、例子

         在天猫华为手机旗舰店,用户可以购买各种不同型号的华为手机,三位华为忠实粉丝,想购买华为 MateX 系列最新款手机,但是因为手机芯片原因,MateX 系列手机一直处于断货状态,网站提供了“到货通知”的选项,只要选择了该选项的用户,在手机到货时就会第一时间收到到货通知,请选择合适的模式设计该模块。
1.Obesrver
# @Time    : 2022/11/21 14:25
# @Author  : ZQH
# @FileName: Observer.py
# @Software: PyCharm

from abc import ABCMeta, abstractmethod

# 抽象观察者
class Zqh0224StaffObserve(metaclass=ABCMeta):
    @abstractmethod
    def update(self,notice): # notice 是一个 notice类对象
        pass

2.ConcreteObserver

# @Time    : 2022/11/21 14:25
# @Author  : ZQH
# @FileName: ConcreteObserver.py
# @Software: PyCharm

from Observer import Zqh0224StaffObserve


class Zqh0224HuaweiFans(Zqh0224StaffObserve):
    def __init__(self,name):
        self.name = name
        self.information = None

    def update(self,notice):
        self.information = self.name + '收到消息:' + notice.information

3.Subject

# @Time    : 2022/11/21 14:24
# @Author  : ZQH
# @FileName: Subject.py
# @Software: PyCharm


# 目标 天猫华为手机旗舰店
class Zqh0224HuaweiMall():
    def __init__(self):
        self.observes = []  # 订阅的观察者列表

    # 添加观察者
    def attach(self, obs):
        self.observes.append(obs)

    # 删除观察者
    def detach(self, obs):
        self.observes.remove(obs)

    # 发布消息,每个观察者能接受消息
    def notify(self):
        for obs in self.observes:
            obs.update(self)

4.ConcreteSubject

# @Time    : 2022/11/21 14:25
# @Author  : ZQH
# @FileName: ConcreteSubject.py
# @Software: PyCharm

from Subject import Zqh0224HuaweiMall


# 具体目标 到货通知
class Zqh0224ArrivalNotification(Zqh0224HuaweiMall):
    def __init__(self, company_info=None):
        super().__init__()
        self.__company_info = company_info

    # 读操作
    @property
    def information(self):
        return self.__company_info

    # 写操作
    @information.setter
    def information(self, info):
        self.__company_info = info
        self.notify()

四、优缺点 

1.观察者模式的优点
(1)观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递长期,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
(2)观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,每一个具体观察者都符合抽象观察者的定义。观察目标不需要了解其具体观察者,只需知道它们都有一个共同的接口即可。由于观察目标和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
(3)观察者模式支持广播通信,观察目标会向所有注册的观察者发出通知,简化了一对多系统设计的难度。
(4)观察者模式符合“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。


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

观察者模式是一种行为设计模式,它用于在对象之间建立一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新。 在Python中,可以使用以下几个元素实现观察者模式: 1. 主题(Subject):主题是被观察的对象,它维护了一个观察者列表,并提供了用于添加、删除和通知观察者的方法。 2. 观察者(Observer):观察者是依赖主题的对象,它定义了一个接收主题通知的方法。 3. 具体主题(Concrete Subject):具体主题是主题类的实现,它维护了一个状态,并在状态发生变化时发送通知给观察者。 4. 具体观察者(Concrete Observer):具体观察者是观察者类的实现,它实现了接收主题通知的方法,并根据通知进行相应的操作。 下面是一个简单的示例代码,演示了如何使用Python实现观察者模式: ```python class Subject: def __init__(self): self.observers = [] def attach(self, observer): self.observers.append(observer) def detach(self, observer): self.observers.remove(observer) def notify(self): for observer in self.observers: observer.update() class Observer: def update(self): pass class ConcreteSubject(Subject): def __init__(self, state): super().__init__() self.state = state def get_state(self): return self.state def set_state(self, state): self.state = state self.notify() class ConcreteObserver(Observer): def __init__(self, name): self.name = name def update(self): print(f"{self.name} received notification.") # 使用示例 subject = ConcreteSubject("Initial state") observer1 = ConcreteObserver("Observer 1") observer2 = ConcreteObserver("Observer 2") subject.attach(observer1) subject.attach(observer2) subject.set_state("New state") ``` 在上面的示例中,`Subject`类表示主题,`Observer`类表示观察者。`ConcreteSubject`和`ConcreteObserver`是它们的具体实现。当`ConcreteSubject`的状态发生变化时,它会通知所有的观察者,并调用观察者的`update`方法进行相应的处理。 希望这个示例能够帮助你理解Python中的观察者模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依恋、阳光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值