前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >每天认识一种设计模式之观察者模式

每天认识一种设计模式之观察者模式

原创
作者头像
JDK7.0
发布2025-03-10 13:58:26
发布2025-03-10 13:58:26
1340
举报

观察者模式的定义

观察者模式(Observer Pattern)是一种行为设计模式,用于在对象之间建立一对多的依赖关系,当一个对象(被观察者/主题)的状态发生变化时,所有依赖它的对象(观察者)会自动收到通知并更新。

观察者模式的核心组成

  • Subject(主题/被观察者)
    • 维护一个观察者列表,提供注册、删除和通知观察者的方法。

核心方法:attach(), detach(), notify()

  • Observer(观察者)
    • 定义观察者的更新接口,当主题状态变化时被调用。
    • 核心方法:update()
  • ConcreteSubject(具体主题)
    • 实现主题接口,存储具体状态数据,并在状态变化时通知所有观察者。
  • ConcreteObserver(具体观察者)
    • 实现观察者的更新方法,执行与主题状态变化相关的逻辑。

观察者模式的实现(PHP示例)

1. 定义主题和观察者接口
代码语言:php
复制
// 主题接口
interface Subject {
    public function attach(Observer $observer);
    public function detach(Observer $observer);
    public function notify();
}

// 观察者接口
interface Observer {
    public function update(Subject $subject);
}
2. 实现具体主题
代码语言:php
复制
class ConcreteSubject implements Subject {
    private $observers = [];
    private $state;

    // 注册观察者
    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 setState($state) {
        $this->state = $state;
        $this->notify();
    }

    // 获取状态
    public function getState() {
        return $this->state;
    }
}
3. 实现具体观察者
代码语言:php
复制
class ConcreteObserver implements Observer {
    private $name;

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

    // 观察者收到通知后的响应逻辑
    public function update(Subject $subject) {
        $state = $subject->getState();
        echo "观察者 {$this->name} 收到通知:主题状态已更新为 {$state}\n";
    }
}
4. 使用示例
代码语言:php
复制
// 创建主题
$subject = new ConcreteSubject();

// 创建观察者并注册
$observer1 = new ConcreteObserver("Observer 1");
$observer2 = new ConcreteObserver("Observer 2");
$subject->attach($observer1);
$subject->attach($observer2);

// 修改主题状态,触发通知
$subject->setState("新状态");
// 输出:
// 观察者 Observer 1 收到通知:主题状态已更新为 新状态
// 观察者 Observer 2 收到通知:主题状态已更新为 新状态

// 移除一个观察者
$subject->detach($observer2);
$subject->setState("更新后的状态");
// 输出:
// 观察者 Observer 1 收到通知:主题状态已更新为 更新后的状态

观察者模式的优势

  1. 解耦:主题和观察者之间松耦合,主题无需知道观察者的具体实现。
  2. 动态扩展:可以随时添加或删除观察者,不影响系统其他部分。
  3. 广播通信:主题变化时,所有观察者自动同步更新。

适用场景

  1. 事件驱动系统:如用户界面事件(按钮点击)、游戏中的成就系统。
  2. 数据监控:日志系统、实时数据仪表盘。
  3. 分布式系统的状态同步:如订单状态变更通知多个服务。

观察者模式 vs. 发布-订阅模式

  • 观察者模式:直接通信,主题和观察者之间有明确的依赖关系。
  • 发布-订阅模式:通过中介(事件总线)通信,发布者和订阅者解耦更彻底。

总结

观察者模式通过定义对象间的一对多依赖关系,实现了状态变化的自动通知机制,是解耦和动态扩展的经典设计模式。在 PHP 中,可以通过接口和类轻松实现,适用于需要实时响应状态变化的场景。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 观察者模式的定义
  • 观察者模式的核心组成
  • 观察者模式的实现(PHP示例)
  • 观察者模式的优势
  • 适用场景
  • 观察者模式 vs. 发布-订阅模式
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档