资讯专栏INFORMATION COLUMN

观察者模式的总结

aikin / 1558人阅读

摘要:什么是观察者模式观察者模式用于实现对对象进行观察一旦主体对象状态发生改变,与之关联的观察者对象会收到通知,并进行相应操作。应用观察者模式的好处观察者模式解除了主体和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。

什么是观察者模式

观察者模式用于实现对对象进行观察:一旦主体对象状态发生改变,与之关联的观察者对象会收到通知,并进行相应操作。

举个例子说明:
假设一个这样的情景,当公司有一个新员工入职了,入职的当天,HR需要为他办理入职手续,网管需要给他配好电脑和办公用品,部门主管需要带他熟悉部门。传统的编程方式,就是在员工入职这个事件发生的代码之后直接加入处理逻辑,当后续我们需要增加处理逻辑时(比如员工入职后增加培训),代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码。运用观察者模式,将员工的入职作为事件,其他的处理逻辑都做为观察者的操作,那么,当以后需要再增加更多的逻辑时,新增逻辑代码就会很方便。具体代码实现如下。

代码实现

首先定义一个观察者接口,所有的观察者都实现这个接口(为什么要定义成接口呢?因为每一个观察者的具体行为需要具体去实现,用接口定义一个统一的方法,具体的实现交给观察者去实现)

</>复制代码

  1. interface observer
  2. {
  3. public function update();
  4. }

再定义一个事件生成器的抽象类,用来使继承它的事件都具有通知观察者的能力。

</>复制代码

  1. abstract class EventGenerator
  2. {
  3. private $observers = [];
  4. //定义一个添加观察者的方法
  5. public function addOberver(Observer $observer)
  6. {
  7. $this->observers[] = $observer;
  8. }
  9. //定义一个通知观察者的方法
  10. public function notify()
  11. {
  12. foreach($this->observers as $observer)
  13. {
  14. $observer->update();
  15. }
  16. }
  17. }

然后再来定义事件类

</>复制代码

  1. class event extends EventGenerator
  2. {
  3. //定义一个触发观察者的方法
  4. public funtion trigger()
  5. {
  6. echo "Event
    ";
  7. //开始通知观察者
  8. $this->notify();
  9. }
  10. }

开始使用

</>复制代码

  1. $event = new event();
  2. $event->trigger();

这个时候,当我们要在事件发生的时候增加别的操作,只需要新增观察者就可以了

新增一个观察者

</>复制代码

  1. class Observer1 implements Observer
  2. {
  3. public function update()
  4. {
  5. echo "操作1
    ";
  6. }
  7. }

然后使用的时候就是

</>复制代码

  1. $event = new event();
  2. // 增加观察者
  3. $event->addObserver(new Observer1);
  4. $event->trigger();

如果需要在事件发生后再增加操作,只需再新增相应的观察者即可。

应用观察者模式的好处

观察者模式解除了主体和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。降低对象之间的耦合度以达到解耦的目的,符合"开闭原则"的要求。

利用 SPL 实现观察者模式

PHP 通过内置的 SPL 扩展提供了对观察者模式的原生支持,其中的观察者由 3 个元素组成 : SplObserver 接口、 SplSubject 接口和 SplObjectStorage 工具类。下面是利用 SPL 实现观察者模式的代码。SPL 的地址见这里。

</>复制代码

  1. class MyObserver1 implements SplObserver {
  2. public function update(SplSubject $subject) {
  3. echo __CLASS__ . " - " . $subject->getName();
  4. }
  5. }
  6. class MyObserver2 implements SplObserver {
  7. public function update(SplSubject $subject) {
  8. echo __CLASS__ . " - " . $subject->getName();
  9. }
  10. }
  11. class MySubject implements SplSubject {
  12. private $observers;
  13. private $name;
  14. public function __construct($name) {
  15. $this->observers = new SplObjectStorage();
  16. $this->name = $name;
  17. }
  18. public function attach(SplObserver $observer) {
  19. $this->observers->attach($observer);
  20. }
  21. public function detach(SplObserver $observer) {
  22. $this->observers->detach($observer);
  23. }
  24. public function notify() {
  25. foreach ($this->observers as $observer) {
  26. $observer->update($this);
  27. }
  28. }
  29. public function getName() {
  30. return $this->name;
  31. }
  32. }
  33. $observer1 = new MyObserver1();
  34. $observer2 = new MyObserver2();
  35. $subject = new MySubject("test");
  36. $subject->attach($observer1);
  37. $subject->attach($observer2);
  38. $subject->notify();
  39. /*
  40. 输出:
  41. MyObserver1 - test
  42. MyObserver2 - test
  43. */
  44. $subject->detach($observer2);
  45. $subject->notify();
  46. /*
  47. 输出:
  48. MyObserver1 - test
  49. */

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26164.html

相关文章

  • 慕课网_《模式秘密之察者模式》学习总结

    摘要:时间年月日星期二说明本文部分内容均来自慕课网。慕课网教学源码学习源码第一章观察者模式概述课程简介观察者模式的定义定义对象间的一种一对多的依赖关系。 时间:2017年08月29日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github.com/z...

    iKcamp 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    Dionysus_go 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    vspiders 评论0 收藏0
  • 《JavaScript设计模式》读后感 觉很复杂

    摘要:想继续了解设计模式必须要先搞懂面向对象编程,否则只会让你自己更痛苦。创建型设计模式主要有简单工厂模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式和单例模式,下面一一道来。而工厂方法模式本意是将实际创建对象的工作推迟到子类中。 接触前端两三个月的时候,那时候只是听说设计模式很重要,然后我就去读了一本设计模式的书,读了一部分,也不知道这些设计模式到底设计出来干嘛的,然后就没再看了。后...

    e10101 评论0 收藏0
  • PHPer月工作总结察者&装饰器模式

    摘要:我们可以把取消发货单和取消订单看成一个被观察或被订阅的类实例的对象,一旦发生取消行为,我们立即通知各个观察者做出相对应的行为。装饰器模式装饰器思想,不管以前业务逻辑,甚至不去读,调用之前的接口装饰上新的数据,达到自己的目的。 前言 还是每月的目标至少写一篇文章,一晃八月份就要过去了,这个月依然没有什么产出,毫无疑问最近的状态就是不停的工作,不停的加班。所以还是把最近工作进行一个总结,首...

    MadPecker 评论0 收藏0

发表评论

0条评论

aikin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<