观察者模式(Observer Pattern)是一种行为型设计模式,其中一个对象(称为主题)维护其依赖项(称为观察者)的列表,并在主题状态发生变化时通知观察者。这种模式用于实现分布式事件处理系统。

以下是一个简单的 PHP 观察者模式的示例:
<?php

// 主题接口
interface Subject {
    public function addObserver(Observer $observer);
    public function removeObserver(Observer $observer);
    public function notifyObservers();
}

// 观察者接口
interface Observer {
    public function update($data);
}

// 具体主题类
class ConcreteSubject implements Subject {
    private $observers = [];
    private $state;

    public function addObserver(Observer $observer) {
        $this->observers[] = $observer;
    }

    public function removeObserver(Observer $observer) {
        $index = array_search($observer, $this->observers);
        if ($index !== false) {
            unset($this->observers[$index]);
        }
    }

    public function setState($state) {
        $this->state = $state;
        $this->notifyObservers();
    }

    public function notifyObservers() {
        foreach ($this->observers as $observer) {
            $observer->update($this->state);
        }
    }
}

// 具体观察者类
class ConcreteObserver implements Observer {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function update($data) {
        echo "Observer $this->name received update with data: $data\n";
    }
}

// 客户端代码
$subject = new ConcreteSubject();

$observer1 = new ConcreteObserver("Observer1");
$observer2 = new ConcreteObserver("Observer2");

$subject->addObserver($observer1);
$subject->addObserver($observer2);

$subject->setState("State1");
$subject->setState("State2");

$subject->removeObserver($observer1);

$subject->setState("State3");

在这个例子中,Subject 接口定义了主题的基本方法,包括添加、删除和通知观察者。Observer 接口定义了观察者的基本方法,包括更新方法。

ConcreteSubject 类是具体的主题类,负责维护观察者列表并通知它们。ConcreteObserver 类是具体的观察者类,实现了更新方法,用于接收主题的通知。

客户端代码创建了一个具体主题对象和两个具体观察者对象,并通过添加、删除观察者和设置主题状态来演示观察者模式的使用。

观察者模式的优点在于它实现了主题和观察者之间的松耦合,允许在不修改主题或观察者代码的情况下增加新的观察者。这样的设计模式非常适用于事件驱动的系统。


转载请注明出处:http://www.pingtaimeng.com/article/detail/11959/PHP