当前位置: 首页 > article >正文

行为型设计模式-观察者(observer)模式

设计模式汇总:查看

通俗示例

想象一下你订阅了一个新闻网站,每当有重大新闻发生时,网站会立即向你发送通知。你不需要一直刷新网站,只需等待通知即可。这里,新闻网站就是观察者模式中的“主题”(Subject),而你作为订阅者就是“观察者”(Observer)。当新闻(即“主题”的状态)更新时,新闻网站会自动通知所有订阅者(观察者),这就是观察者模式的典型应用。

通俗解释

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,允许一个对象(称为主题)的状态发生变化时,自动通知所有依赖于它的对象(称为观察者)。在观察者模式中,主题对象维护一组观察者,并负责通知它们任何状态变化。

观察者模式的组成包括以下几部分:

  • 主题(Subject):负责维护观察者列表,并提供方法来添加、删除和通知观察者。
  • 观察者(Observer):定义一个更新接口,当主题对象状态改变时,观察者会接到通知并进行相应的处理。
  • 具体主题(Concrete Subject):实现主题接口,并管理观察者的状态和通知逻辑。
  • 具体观察者(Concrete Observer):实现观察者接口,并具体处理状态变化的通知。

观察者模式的优点

  • 低耦合性:主题和观察者之间的依赖关系被最小化,它们可以独立地改变和复用。
  • 动态性:可以在运行时动态地添加或删除观察者,主题无需了解任何事情。
  • 响应性:主题状态发生变化时,所有观察者都会立即得到通知。

Python代码示例

以下是一个观察者模式的简单实现:

# 观察者接口
class Observer:

    def update(self, subject):
        pass


# 具体观察者
class ConcreteObserver(Observer):

    def __init__(self, name):
        self.name = name

    def update(self, subject):
        print(f"Observer {self.name} notified about {subject._state}")


# 主题接口
class Subject:
    def attach(self, observer):
        pass

    def detach(self, observer):
        pass

    def notify(self):
        pass


# 具体主题
class ConcreteSubject(Subject):
    def __init__(self):
        self._observers = []
        self._state = None

    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(self)

    def set_state(self, state):
        self._state = state
        self.notify()


# 客户端代码
if __name__ == "__main__":
    # 创建主题和观察者
    subject = ConcreteSubject()
    observer1 = ConcreteObserver("observer1")
    observer2 = ConcreteObserver("observer2")

    # 添加观察者到主题
    subject.attach(observer1)
    subject.attach(observer2)

    # 更改主题状态,观察者会收到通知
    subject.set_state("New State")
    subject.set_state("New State 2")

在这个例子中,Observer是观察者接口,ConcreteObserver是具体观察者类。Subject是主题接口,ConcreteSubject是具体主题类,它维护了一个观察者列表,并在状态变化时通知它们。客户端代码创建了主题和观察者对象,展示了如何将观察者添加到主题,并触发状态变化的通知。

总结

观察者模式通过解耦主题和观察者,提高了应用程序的灵活性和可扩展性。它特别适用于那些当一部分代码的变动需要通知多个其他部分,而这些部分又不应该直接相互通信的情况。观察者模式让这些部分可以独立地改变,而不会影响到其他部分。


http://www.kler.cn/a/282234.html

相关文章:

  • 《C++设计模式:重塑游戏角色系统类结构的秘籍》
  • JavaScript中如何使用Promise处理异步操作?
  • 哈希表学习分享
  • 从零入门激光SLAM(二十三)——direct_visual_lidar_calibration全型号激光雷达-相机标定包
  • 基于视觉智能的时间序列基础模型
  • Spring 中的 BeanDefinitionParserDelegate 和 NamespaceHandler
  • 机器学习/数据分析--通俗语言带你入门随机森林,并用随机森林进行天气分类预测(Accuracy为0.92)
  • Nginx中设置服务器备用(backup)状态的策略与实践
  • 16. 结构体占内存大小是怎么计算的,有哪些原则?
  • OJ-0829
  • Python 中的 `and`, `or`, `not` 运算符:介绍与使用
  • Linux进程间的通信(二)管道通信及其实际应用(主要是实际编程应用,底层涉及不太多,想了解底层参考《UNIX环境高级编程》)
  • C++ QT 单例模式
  • uniapp秋云图表报错json underfind的原因
  • 【C#】【EXCEL】Bumblebee/Components/Analysis/GH_Ex_Ana_CondBetween.cs
  • 《python语言程序设计》2018版第8章第6题统计字符串中的字母个数
  • C#实现文件的上传
  • 华为AR路由使用PPPoE获取IPv6地址上网
  • 软件工程基础知识(3)
  • 【C++】汇编分析
  • 【软件工程】软件工程
  • Oracle(87)如何判断是否需要重建索引?
  • 计算机毕业设计选题推荐-救援物资管理系统-Java/Python项目实战
  • numpy 中的降维与升维
  • 编程路上的“迷宫逃脱”:从Bug堆到算法之巅的奇妙之旅
  • Renesa Version Board和微信小程序通信