设计模式常用八式之第六式 观察者模式(Observer)

官方定义

指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又被称为发布-订阅模式,它是对象行为型模式。
以上定义包含了两个条件:一是被依赖的对象叫作被观察者,依赖的对象叫作观察者;二是观察者观察被观察者的状态变化

具体的叫法

  • 发布者-订阅者
  • 生产者-消费者
  • 事件发布-事件监听

实践场景

  • 当一个对象状态的改变需要改变其他对象时:比如下单成功时,需要通知统计,库存等模块改变对应的数量
  • 一个对象发生改变时只想要发送通知,而不需要知道接受者是谁:比如商城需要给老客户发送通知,而老客户不需要知道有哪些老客户接收到了。
  • 抖音发布的场景: 这是典型观察者模式,只要作者发布了短视频,关注了的人就会收到通知,如果取消关注了则将无法收到。
  • 需要建立基于事件触发的场景:比如:在增删改等事件操作成功时,触发监控事件对象的行为改变。

UML类图

«interface» Annoucement publish() LongMenExpress publish() «interface» Branch accept() LongMenBranch accept() Client 实现 实现 使用 通知与添加进依赖

实际操作

// 通告
interface Announcement
{
    // 发布任务
    public function publish();
}
// 分局
interface Branch
{
    // 接收
    public function accept();
}

// 龙门总局 实现通告发布的功能
class LongMenExpress implements Announcement
{
    public $branch = []; // 

    /**
     * 发布任务
     */
    public function publish()
    {
        foreach ($this->branch as $branch) {
            $branch->accept();
        }
    }

    // 添加接收了任务的分局
    public function addBranch(Branch $task)
    {
        $className = get_class($task);

        $this->branch[$className] = $task;
    }
}

class LongMenBranch implements Branch
{
    /**
     * 接收了任务
     */
    public function accept()
    {
       echo '龙门镖局接收任务'."\n";
    }
}

class BeijingLongMenBranch implements Branch
{
    public function accept()
    {
        echo '北京龙门镖局接收任务'."\n";
    }
}
// 调用
$longMenExpress = new LongMenExpress();
$longMenExpress->addBranch(new LongMenBranch());
$longMenExpress->addBranch(new BeijingLongMenBranch());
$longMenExpress->publish();

···输出结果
龙门镖局接收任务
北京龙门镖局接收任务
····

优点

  • 能够降低系统与系统之间的耦合性
  • 提升代码扩展性
  • 可以建立一套基于目标对象特定操作或数据的触发机制。

缺点

  • 增加代码的理解难度
  • 降低了系统性能。

总结

找到合适的变化并进行正确的处理才是使用观察者模式的正确打开方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值