观察者模式(Observer)
是一种使用非常多的行为型模式,内部主要有观察者和被观察者(目标)两个对象,观察者根据目标的变化而相应的变化。
提到这种模式,让我想到了近两年很火的几款游戏,比如:王者荣耀5V5对战,当你的队友被攻击的时候,仔细的人会发现你的队友小头像会不断变红,直到变成灰色倒计时,最后会有一个广播你的队友被杀的信息。
在这个过程中,被攻击的队友是目标,你和其它队友是观察者,接收到队友被攻击的信号,之后迅速赶过去支援。
提到这种模式,让我想到了近两年很火的几款游戏,比如:王者荣耀5V5对战,当你的队友被攻击的时候,仔细的人会发现你的队友小头像会不断变红,直到变成灰色倒计时,最后会有一个广播你的队友被杀的信息。
在这个过程中,被攻击的队友是目标,你和其它队友是观察者,接收到队友被攻击的信号,之后迅速赶过去支援。
在整个过程中,观察者可以三个人可以是五个人,很方便的扩展,而不相互影响。
<?php // 抽象中心 abstract Class Central { /** * 观察者集合 * @var array */ private $observers = array(); /** * 添加观察者 * @access public * @param object $observer 观察者 */ public function Attach(Observer $observer) { array_push($this->observers,$observer); } /** * 通知函数 * @access public */ function Notify() { foreach ($this->observers as $k => $v) { $v->Update(); } } } // 控制中心 Class controlCentral extends Central { /** * 通知信息 * @var array */ public $message; } abstract Class Observer { /** * 通知函数 * @access public */ public abstract function Update(); } Class concreteObserver extends Observer { /** * 观察者 * @var string */ private $name; /** * 观察状态 * @var string */ private $observerState; /** * 控制中心 * @var object */ public $central ; /** * 构造函数 * @access public * @param object $_cen 控制中心 * @param object $_name 观察者 */ function __construct(controlCentral $_cen,$_name) { $this->name = $_name; $this->central = $_cen; } /** * 更新通知信息 * @access public */ function Update() { $this->observerState = $this->central->message; echo $this->name."发现:".$this->observerState."<br/>"; } }
<?php // 观察者模式 header("Content-Type:text/html;charset=utf-8"); require_once "Observe.php"; // 实例观察者中心 $central = new controlCentral(); // 通知信息 $central->message = "骑士正在被攻击"; // 具体战士 $zs = new concreteObserver($central,"战士"); // 具体牧师 $ms = new concreteObserver($central,"牧师"); // 控制中心增加观察者 $central->Attach($zs); $central->Attach($ms); // 通知 $central->Notify();
输出结果:
战士发现:骑士正在被攻击
牧师发现:骑士正在被攻击