行为型模式---观察者模式

本文深入讲解观察者模式,包括其别称、角色定义、实现原理及代码示例。通过一个女神生日的例子,展示了如何利用观察者模式解耦组件,实现灵活扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念(Observer Pattern)

观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
一种事件系统,允许某个类观察另一个类的状态,当观察的类状态发生改变的时候,观察类可以收到通知并做出相应的动作,避免组件之间紧密耦合,使得系统更易于扩展。

角色

  • Observer观察者:抽象接口
  • ConcreteObserver具体观察者:备胎1小明,备胎2
  • EventGenerator目标:添加观察者,提醒,删除观察者
  • ConcreteSubject具体目标:女神

UML图

例子:一个女神的生日

EventGenerator.php

<?php
/**
 * Created by IntelliJ IDEA.
 * User: 何晓宏
 * Date: 2018/10/12
 * Time: 15:06
 */
namespace ObserverPattern;
abstract class EventGenerator{
    private $observers =array();
    //添加观察者
    function addObserver(Observer $observer){
        $this->observers[]=$observer;

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

    }
    //删除观察者
    function delObserver(Observer $observer){
        //查找对应值在数组中的键
        $key=array_search($observer,$this->observers);

        //根据键删除值并重新索引
        array_splice($this->observers,$key,1);
        echo '备胎从名单中排除';

    }
}

Observer.php

<?php
/**
 * Created by IntelliJ IDEA.
 * User: 何晓宏
 * Date: 2018/10/12
 * Time: 15:06
 */
namespace ObserverPattern;
interface Observer{
    function update($event_info=null);
}

具体女神与具体备胎


class Goddess extends EventGenerator {
    function birthday(){
        echo "女神生日到了\n";
        $this->notify();
    }
}

class Beitai1 implements Observer {

    function update($event_info = null)
    {
        echo "备胎1准备了MAC口红\n";
    }
}
class Beitai2 implements Observer {

    function update($event_info = null)
    {
        echo "备胎2准备了YSL口红\n";
    }
}
$xiaomin=new Beitai1();
$Goddess=new Goddess();
$Goddess->addObserver($xiaomin);
$Goddess->addObserver(new Beitai2);
$Goddess->birthday();
//移除备胎1
$Goddess->delObserver($xiaomin);
$Goddess->birthday();

运行结果

优点:

  • 表示层与数据逻辑层分离,可以有各种各样的不同的表示层作为具体观察者角色
  • 符合开闭原则,降低组件之间的紧密耦合

应用: 购票,通知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值