您现在的位置是:网站首页 > 心得笔记

常用设计模式之观察者模式

盛悦2025-02-2179人围观
简介本文将记录常用设计模式之观察者模式

观察者模式定义

观察者模式是一种行为模式,其核心思想是让多个观察者对象同时监听某一主题对象,当主题对象发生变化时,及时通知所有观察者进行
响应的更新操作。

观察者涉及的角色

1.Subject(主题):主题也称之为被观察者,它是一个具有状态的对象。当其状态发生变化时,会通知所有注册的观察者对象。主题通常提供
注册、删除和通知观察者的方法。
2.Observer(观察者):观察者也称之为订阅者,它是一个接口或抽象类,定义了一个更新方法,用于接收和处理主题状态的变化通知。

观察者代码展示

<?php
// 主题接口
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 = [];

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

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

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

    public function someBusinessLogic() {
        // 在某些业务逻辑发生改变时,通知所有观察者
        $this->notify();
    }
}

// 具体观察者类
class ConcreteObserver implements Observer {
    public function update(Subject $subject) {
        echo "观察者收到了更新通知\n";
    }
}

// 使用示例
$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver();
$observer2 = new ConcreteObserver();

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

$subject->someBusinessLogic(); // 触发更新通知
?>

在上面的示例中,ConcreteSubject 类代表了具体的主题,实现了 Subject 接口中的方法;ConcreteObserver 类代表了具体的观察者,实现了 Observer 接口中的方法。当 ConcreteSubject 的状态发生变化时,它会调用 notify() 方法通知所有观察者,观察者收到通知后会执行 update() 方法进行相应的更新操作。