首页 > 教程 > 观察者模式:行为设计模式的介绍和实现

观察者模式:行为设计模式的介绍和实现

时间:2024-06-06 | 来源: | 阅读:195

话题: 观察者 设计

设计模式 【设计模式】工厂方法模式 【设计模式】抽象工厂模式 【设计模式】单例模式 【设计模式】策略模式 【设计模式】观察者模式 一、介绍 观察者模式是一种行为设计模式,当一个对象的状态发生改变时,依赖(观察)它的对象会接收到通知,并进行自动的更新操作。 举例:某公司发布了一款新的手机,性能很强大,

观察者模式是一种行为设计模式,它允许对象在状态发生改变时通知其依赖者,并自动进行更新操作。这篇文章将介绍观察者模式的优缺点、核心结构以及在PHP中的代码实现。

设计模式

  • 【设计模式】工厂方法模式
  • 【设计模式】抽象工厂模式
  • 【设计模式】单例模式
  • 【设计模式】策略模式
  • 【设计模式】观察者模式

一、介绍

观察者模式是一种行为设计模式,当一个对象的状态发生改变时,依赖(观察)它的对象会接收到通知,并进行自动的更新操作。

举例:某公司发布了一款新的手机,性能很强大,许多人都想买,但是该公司又没宣布售卖时间。想买的人为了第一时间就拥有这台手机,就必须每天到官网或线下实体店看有没有出售,这样对于用户来说体验很不好。如果不想频繁的去查看,这时想买手机的用户就可以在实体店或网站上留下联系方式,等到手机出售的当天公司通过邮件或者短信的形式通知到购买者。

二、优缺点

优点:

  • 符合开闭原则。 无需修改发布者代码就能引入新的观察者类。
  • 可以在运行时建立对象之间的联系。

缺点:

  • 无法设置订阅者收到的顺序
  • 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率

三、核心结构

  • Subject(目标):被观察者,它是指被观察的对象。 类中有一个用来存放观察者对象的容器,这个容器是被观察者类的核心。其中还有几个方法:
    • attach方法是向这个容器中添加观察者对象。
    • detach方法是从容器中移除观察者对象。
    • notify方法是依次调用观察者对象的对应方法。
  • ConcreteSubject(具体目标):目标类的具体子类,当它的状态发生改变时,向它的各个观察者发出通知。同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。
  • Observer(观察者):观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法 update()。
  • ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致,它实现了在观察者 Observer 中定义的 update()方法。

四、代码实现

1、在PHP中已经有相关的Subject(目标)和Observer(观察者)接口了,我们可以拿来直接实现。分别是SplSubject和SplObserver接口,以下代码就是以这两个接口为例进行编写。其中还用到一个SplObjectStorage类,它也是PHP中的一个类,用于存储和管理对象。它是一个关联数组,其中键是对象的哈希值,值是对象本身。

1.1、实现ConcreteSubject(具体目标)

1.2、实现ConcreteObserver(具体观察者),我这里实现了两个观察者,分别为 ConcreteObserverB 和?ConcreteObserverA。

1.3、客户端调用

1.4、客户端调用结果展示

2、上面介绍了使用PHP本身观察者设计模式的接口,下面就自己手写一个观察者模式。

2.1、实现Subject(目标)接口

2.2、实现ConcreteSubject(具体目标)

2.3、实现Observer(观察者)

2.4、实现ConcreteObserver(具体观察者),分别为 ConcreteObserverB 和?ConcreteObserverA。

2.5、客户端调用

2.6、运行结果展示


湘ICP备2022002427号-10湘公网安备:43070202000427号
© 2013~2019 haote.com 好特网