PHP设计模式—观察者模式

定义:

观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

结构:

  • EventGenerator(抽象基类):负责添加观察者和通知观察者。
  • Event(具体事件类):当状态发生改变时,通知所有登记过的观察者,继承于EventGenerator。
  • Observer(观察者接口):为所有的具体观察者定义一个接口,在得到通知时更新自己。
  • Observer1(具体观察者):实现具体通知接口。
  • Client:客户端代码。

代码实例:

/**
 * EventGenerator.php(抽象类)
 * Class EventGenerator
 */
abstract class EventGenerator
{
    private $observers = [];

    /**
     * 添加观察者
     */
    public function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    /**
     * 通知所有观察者
     */
    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update();
        }
    }
}

/**
 * Event.php(事件,当状态发生改变时,通知所有登记过的观察者)
 * Class Event
 */
class Event extends EventGenerator
{
    public function trigger()
    {
        echo "Event<br/>\n";
        $this->notify();
    }
}

/**
 * Observer.php(Observer 接口)
 * Interface Observer
 */
interface Observer
{
    public function update($event_info = null);
}

/**
 * Observer1.php(观察者1)
 * Class Observer1
 */
class Observer1 implements Observer
{
    public function update($event_info = null)
    {
        // TODO: Implement update() method.
        echo "通知观察者1<br/>\n";
    }
}

/**
 * Observer2.php(观察者2)
 * Class Observer2
 */
class Observer2 implements Observer
{
    public function update($event_info = null)
    {
        // TODO: Implement update() method.
        echo "通知观察者2<br/>\n";
    }
}

客户端调用:

$event = new Event();
$event->addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->trigger();

结果:

Event
通知观察者1
通知观察者2

总结:

  • 一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增加之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码。
  • 观察者模式实现了低耦合,非侵入式的通知与更新机制。
  • 当一个对象的改变需要同时改变其他对象,并且它不知道具体有多少对象有待改变时,应该使用观察者模式。
(0)

相关推荐

  • 设计模式(20) 观察者模式

    观察者模式是一种平时接触较多的模式.它主要用于一对多的通知发布机制,当一个对象发生改变时自动通知其他对象,其他对象便做出相应的反应,同时保证了被观察对象与观察对象之间没有直接的依赖. GOF对观察者模 ...

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式 观察者,貌似在很多科幻作品中都会有这个角色的出现.比如我很喜欢的一部美剧<危机边缘>,在这个剧集中,观察者不停的穿越时空记录着各种各样的人或事.但是,设计模式中 ...

  • 常见的设计模式及应用场景

    一.单例模式 单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例. 优点:不会频繁地创建和销毁对象,浪费系统资源. 使用场景:IO ...

  • 设计模式中的观察者模式

    观察者模式是一种软件设计模式,其中一个名为主体(Subject)的对象维护其依赖项列表,称为观察者,并通常通过调用它们(observers)的方法之一来自动通知它们任何状态更改. 观察者模式主要用于在 ...

  • 设计模式-行为型-观察者模式

    观察者模式(Observer): 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 观察者模式的角色: 1)抽象目标(Subject):也叫抽象 ...

  • 设计模式--观察者模式

    设计模式--观察者模式

  • 简说设计模式——观察者模式

    一.什么是观察者模式 观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳.各种玩耍的经历,这时总会有一个"放风"的小伙伴,当老师即将出现时及时"通 ...

  • 结合JDK源码看设计模式——观察者模式

    前言: 现在我们生活中已经离不开微信,QQ等交流软件,这对于我们来说不仅是交流,更有在朋友圈中或空间中进行分享自己的生活,同时也可以通过这个渠道知道别人的生活.我们在看朋友圈的时候其实我们扮演的就是一 ...

  • [PHP小课堂]PHP设计模式之观察者模式

    [PHP小课堂]PHP设计模式之观察者模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 无废话设计模式(15)行为型模式--观察者模式

    0-前言 观察者模式定义:定义了一种一对多的依赖关系让多个观察者对象同事监听某一主题对象. 这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己: 1-实现 1-1.简单UML图 ...

  • 软件设计模式修炼 -- 观察者模式

    观察者模式是一种经常使用的设计模式,在软件系统中对象并不是孤立存在的,一个对象行为的改变可能会导致其他与之存在依赖关系的对象行为发生改变,观察者模式用于描述对象之间的依赖关系. 模式动机 很多情况下, ...

  • 图解Java设计模式之观察者模式

    天气预报项目需求 1)气象站可以将每天测量到的湿度.温度.气压等等以公告的形式发布出去(比如发布到自己的网站或第三方). 2)需要设计开放型API,便于其他第三方也能接入气象站获取数据. 3)提供温度 ...