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

概念(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();

运行结果
行为型模式---观察者模式

优点:

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

应用: 购票,通知