PHP 观察者模式

简介

在软件设计中,观察者模式是一种行为型设计模式,它允许一个对象(称为主题)维护多个依赖于其状态的对象(称为观察者),并且当主题的状态发生变化时自动通知所有观察者。这种模式在 PHP 中广泛应用,它提供了一种优雅的解耦方案,使得系统更易于扩展和维护。

结构

观察者模式通常包括以下几个部分:

  1. 主题(Subject):主题是被观察的对象,它保存了所有观察者的引用并提供了注册和删除观察者的方法。当主题的状态发生变化时,它会通知所有已注册的观察者。
  2. 具体主题(Concrete Subject):继承自主题接口或抽象类,实现了主题中定义的方法。当具体主题的状态发生变化时,它会通知所有已注册的观察者。
  3. 观察者(Observer):观察者是一个接口,用于定义每个观察者必须实现的更新方法,以便在主题状态改变时收到通知。
  4. 具体观察者(Concrete Observer):实现了观察者接口中定义的更新方法。当具体观察者收到通知后,它会执行特定的操作来响应主题状态的改变。

示例代码

让我们用 PHP 实现一个简单的观察者模式。首先,我们需要定义 Subject 和 Observer 接口:

interface Subject {
    public function attach(Observer $observer);
    public function detach(Observer $observer);
    public function notify();
}

interface Observer {
    public function update(Subject $subject);
}

然后,我们创建具体的主题和观察者类:

class ConcreteSubject implements Subject {
    private $observers = [];
    private $state;

    public function attach(Observer $observer) {
        array_push($this->observers, $observer);
    }

    public function detach(Observer $observer) {
        foreach ($this->observers as $key => $value) {
            if ($value === $observer) {
                unset($this->observers[$key]);
            }
        }
    }

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

    public function getState(): int {
        return $this->state;
    }

    public function setState(int $state): void {
        $this->state = $state;
        $this->notify();
    }
}

class ConcreteObserver implements Observer {
    private $name;

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

    public function update(Subject $subject) {
        if ($subject instanceof ConcreteSubject) {
            echo "Observer {$this->name}: Received update - state is now {$subject->getState()}\n";
        }
    }
}

最后,我们可以创建主题并添加观察者:

$subject = new ConcreteSubject();

$observer1 = new ConcreteObserver("Observer 1");
$observer2 = new ConcreteObserver("Observer 2");

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

// 更改主题的状态,通知观察者
$subject->setState(5);

运行此代码将输出:

Observer Observer 1: Received update - state is now 5
Observer Observer 2: Received update - state is now 5

结论

PHP 观察者模式是一种强大的设计模式,可以提高代码的灵活性和可维护性。通过使用观察者模式,我们可以在主题状态改变时自动通知相关对象,而无需修改它们之间的耦合。本教程介绍了观察者模式的基本结构和示例代码,希望能帮助您更好地理解并在项目中应用这一设计模式。