观察者模式(Observer)是一种使用非常多的行为型模式,内部主要有观察者和被观察者(目标)两个对象,观察者根据目标的变化而相应的变化。
提到这种模式,让我想到了近两年很火的几款游戏,比如:王者荣耀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();
输出结果:
战士发现:骑士正在被攻击
牧师发现:骑士正在被攻击