初识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();


输出结果:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值