博客
关于我
PHP设计模式之----观察者模式
阅读量:793 次
发布时间:2023-03-02

本文共 2037 字,大约阅读时间需要 6 分钟。

观察者模式概述与实现

观察者模式(Observer Pattern)是一种设计模式,旨在实现低耦合、非侵入式的通知与更新机制。它的核心思想是:当一个对象的状态发生改变时,其依赖的对象会自动收到通知,并执行相应的更新操作。

观察者模式的场景

传统的事件处理方式通常是直接在事件代码之后添加更新逻辑。当更新逻辑变得复杂时,代码难以维护。此种耦合方式不仅增加了代码的复杂性,还使得添加新的逻辑处理变得困难。观察者模式通过引入通知机制,解决了这一问题。

观察者模式的角色

观察者模式包含以下角色:

  • 目标(Subject):定义一个对象或接口,能够通知其依赖的对象。
  • 观察者(Observer):定义一个接口或抽象类,规定了所有观察者必须实现的操作——执行更新。
  • 具体目标(ConcreteSubject):实现目标接口的具体类,能够维护其自身的状态,并通知所有观察者。
  • 具体观察者(ConcreteObserver):实现观察者接口的具体类,能够接收并处理目标的通知。
  • 观察者模式的代码实现

    1. 抽象观察目标
    abstract class Subject {    protected $observers = array();    abstract public function addObserver(Observer $observer);    abstract public function delObserver(Observer $observer);    abstract public function notify();    abstract public function condition($num);}
    2. 观察者接口
    interface Observer {    function update();}
    3. 具体观察目标
    class ConcreteSubject extends Subject {    public function addObserver(Observer $observer) {        $this->observers[] = $observer;    }    public function delObserver(Observer $observer) {        $key = array_search($observer, $this->observers);        if ($key !== false) {            unset($this->observers[$key]);        }    }    public function notify() {        foreach ($this->observers as $key => $value) {            $value->update();        }    }    public function condition($num) {        if ($num > 100) {            $this->notify();        }    }}
    4. 具体观察者
    class ConcreteObserverA implements Observer {    public function update() {        echo "A报告: 敌军超过一百人了,快撤!";    }    public function eat() {        echo "A在吃饭";    }}class ConcreteObserverB implements Observer {    public function update() {        echo "B报告: 敌军超过一百人了,快撤!";    }    public function sleep() {        echo "B在睡觉";    }}
    5. 测试
    // 测试代码$a = new ConcreteObserverA();$b = new ConcreteObserverB();$subject = new ConcreteSubject();$subject->addObserver($a);$subject->addObserver($b);$subject->condition(1000);

    总结

    通过以上代码实现,可以清晰地看到观察者模式的工作原理。具体目标(ConcreteSubject)通过通知方法(notify())将所有观察者的更新操作(update())触发。当目标的状态满足特定条件(condition())时,会自动通知所有关注其的观察者。这一机制使得代码结构更加清晰,实现了低耦合、非侵入式的更新管理。

    转载地址:http://dltfk.baihongyu.com/

    你可能感兴趣的文章