行为型模式---观察者模式
概念(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();
运行结果
优点:
- 表示层与数据逻辑层分离,可以有各种各样的不同的表示层作为具体观察者角色
- 符合开闭原则,降低组件之间的紧密耦合
应用: 购票,通知