【python设计模式】17、观察者模式

哲学思想:

观察者模式是一种常用的软件设计模式,它的核心思想是将一个对象的状态变化通知给多个观察者,从而让这些观察者能够及时更新自己的状态或执行相应的操作。

在哲学上,观察者模式的思想也有一些类似之处。它可以被解读为一种关注“现象”的方式,即通过对外部事件或者事物的观察,来推断或者理解内在的本质或者规律。

比如在康德的哲学中,他提出了“现象学”这一概念,认为人们只能通过感性经验来观察和认识外部世界,但是我们所能获得的只是表象,真正的本质是无法直接观察到的。这种思想可以被看作是观察者模式的一种哲学表述,即通过观察外部现象,来推断内在本质。

另外,观察者模式还可以被解读为一种“相互作用”的方式。即多个观察者之间通过对同一个对象进行观察和交流,从而相互影响和促进。这种思想也可以被看作是一种哲学观点,即世界是一个相互联系和相互作用的整体,每一个事物和现象都不是孤立存在的,它们之间存在着各种复杂的关系和影响。

总之,观察者模式的思想与哲学上的观念有很多相似之处,它们都强调了对外部现象的观察和理解,以及对内在本质的推断和认识。同时,它们也都强调了事物和现象之间的相互作用和联系,认为世界是一个复杂的整体。

简介:

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多关系,使得当一个对象的状态发生变化时,它的所有依赖对象都能够得到通知并自动更新。观察者模式的核心思想是将观察者(即依赖对象)与被观察者(即主题对象)解耦,从而使得它们可以独立地变化。

在观察者模式中,被观察者维护了一个观察者列表,并提供了添加、删除和通知观察者的方法。当被观察者的状态发生变化时,它会遍历观察者列表,并调用每个观察者的更新方法,以便让它们能够及时更新自己的状态。观察者模式可以用于实现事件驱动系统,例如图形界面组件的事件处理、消息传递系统等。

优点:

观察者模式是一种设计模式,它允许一个对象(称为主题)维护其所有依赖项(称为观察者)的列表,并在其状态发生更改时自动通知它们。以下是观察者模式的一些优点:

  1. 降低对象之间的耦合度:主题和观察者之间是松散耦合的,因为它们不需要了解彼此的细节。主题只知道观察者存在,而观察者只知道主题发生了改变。这使得系统更加灵活,易于维护和扩展。

  2. 易于添加新的观察者:由于观察者与主题之间的耦合度很低,因此可以轻松地添加或删除观察者,而不会对其他对象产生任何影响。

  3. 支持广播通知:当主题状态发生改变时,所有的观察者都会收到通知,这使得在一个事件发生后执行多个操作变得非常容易。

  4. 符合开闭原则:观察者模式使得添加新的观察者不需要修改主题的代码,符合开闭原则,即对扩展开放,对修改关闭。

  5. 支持多级触发:观察者可以是另一个主题的主题,这使得支持多级触发变得非常容易。

总的来说,观察者模式是一种非常有用的模式,可以帮助我们构建松散耦合的系统,提高系统的灵活性和可扩展性。

缺点:

观察者模式是一种常见的设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生改变时,所有的观察者都会收到通知并进行相应的处理。

虽然观察者模式具有许多优点,如松耦合、易于扩展等,但也存在一些缺点,包括以下几点:

  1. 观察者模式可能导致性能问题。当观察者较多或通知频率较高时,观察者们需要频繁地更新自己的状态,这可能导致性能问题。

  2. 观察者模式可能引起循环依赖。如果观察者之间相互依赖,可能会出现循环依赖的情况,这会使程序变得复杂,并可能导致死锁。

  3. 观察者模式可能导致不确定性。由于观察者之间的交互是通过主题对象进行的,所以当观察者之间的交互发生变化时,主题对象的状态可能会受到影响,从而导致不确定性的结果。

  4. 观察者模式可能导致内存泄漏。当观察者没有及时取消注册时,可能会导致内存泄漏问题,因为主题对象仍然保持对它们的引用。

因此,在使用观察者模式时,我们需要考虑这些缺点并尽可能地避免它们的出现,从而更好地利用观察者模式的优点。

实际应用场景:

观察者模式是一种设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新。

以下是一些观察者模式的实际应用场景:

  1. GUI 界面中的事件处理:在 GUI 应用程序中,许多控件(如按钮、文本框、下拉框等)都有事件处理机制,当用户与控件交互时,控件会触发相应的事件。这些事件可以被其他控件(如标签、进度条、图像等)作为观察者来监听,以便在事件发生时做出相应的反应。

  2. 股票行情分析系统:在股票行情分析系统中,当股票价格发生变化时,分析系统需要及时地获取并处理这些数据。使用观察者模式,可以将股票价格作为被观察者,将分析系统作为观察者,当股票价格发生变化时,被观察者会自动通知观察者,观察者可以根据价格变化做出相应的决策。

  3. 消息发布和订阅系统:在消息发布和订阅系统中,发布者和订阅者之间没有直接的关系,发布者只需要将消息发布到消息队列中,订阅者可以从消息队列中获取并处理消息。使用观察者模式,可以将消息队列作为被观察者,将订阅者作为观察者,当有新的消息发布时,被观察者会自动通知观察者。

  4. 游戏中的事件处理:在游戏开发中,许多对象都需要处理各种事件,如角色移动、攻击、受伤等。使用观察者模式,可以将事件作为被观察者,将游戏对象作为观察者,当事件发生时,被观察者会自动通知观察者,观察者可以根据事件做出相应的反应。

  5. 基于 MVC 模式的应用程序:在基于 MVC 模式的应用程序中,模型(Model)通常作为被观察者,视图(View)作为观察者,当模型发生改变时,视图会自动更新以显示最新的数据。

代码实现:

class Observer:
    def update(self, observable, *args, **kwargs):
        pass

class Observable:
    def __init__(self):
        self._observers = set()

    def register_observer(self, observer):
        self._observers.add(observer)

    def unregister_observer(self, observer):
        self._observers.remove(observer)

    def notify_observers(self, *args, **kwargs):
        for observer in self._observers:
            observer.update(self, *args, **kwargs)

class ExampleObservable(Observable):
    def some_action(self):
        self.notify_observers('some_data')

class ExampleObserver(Observer):
    def update(self, observable, *args, **kwargs):
        print(f'Observer received data {args[0]} from observable {observable}')

observable = ExampleObservable()
observer1 = ExampleObserver()
observer2 = ExampleObserver()

observable.register_observer(observer1)
observable.register_observer(observer2)

observable.some_action()

observable.unregister_observer(observer2)

observable.some_action()

在上面的示例代码中,Observer 是一个抽象类,定义了一个 update() 方法,具体的观察者类需要继承这个类并实现 update() 方法。

Observable 类是一个具体的被观察者类,其中包括了注册、注销和通知观察者的方法。

ExampleObservable 类继承自 Observable 类,并在其中定义了一个 some_action() 方法,当这个方法被调用时,会通知所有观察者,并传递一些数据。

ExampleObserver 类继承自 Observer 类,并实现了 update() 方法,当观察者接收到通知时,会调用这个方法并处理相应的数据。

在示例代码中,创建了一个 ExampleObservable 实例和两个 ExampleObserver 实例,先将两个观察者注册到被观察者中,然后调用 some_action() 方法触发通知,最后将一个观察者注销并再次调用 some_action() 方法触发通知。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值