PHP设计模式--观察者模式

  观察者模式(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();  

输出结果:

战士发现:骑士正在被攻击
牧师发现:骑士正在被攻击

猜你喜欢

转载自blog.csdn.net/xhanguomzhu/article/details/79986515