您的位置:首页 > 编程语言 > PHP开发

PHP设计模式之观察者模式

2014-01-16 00:00 821 查看
首先了解观察者模式的概念:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。观察者模式是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间紧密耦。看下面例子你就明白了!
1.使用观察者模式实现消息推送
<?php
/**
 *参考IBM官网:http://www.ibm.com/developerworks/cn/opensource/os-php-designptrns/
 *@author http://www.phpddt.com  */
//观察者
interface IObserver 
{
	public function notify();
}

//定义可以被观察的对象接口
interface IObservable 
{
	public function addObserver($observer);
}

//实现IObservable接口
class MessageSystem Implements IObservable 
{
	private $_observers = array();

	public function addObserver($observer)
	{
		$this->_observers = $observer;
	}

	public function doNotify()
	{
		foreach($this->_observers as $o)
		{
			$o->notify();
		}
	}
}

//实现IObserver接口
class User Implements IObserver
{
	public function __construct($username)
	{
		echo "我是新用户{$username}<br/>";
	}
	//通知观察者方法
	public function notify()
	{
		echo '欢迎新用户';
	}
}

//使用
$u = new MessageSystem();

$u->addObserver(new User('小明'));
//$u->addObserver(new User('小红'));
//$u->addObserver(new User('小黑'));

$u->doNotify();


2.摘自PHPCHINA的一个不错例子:
/**
* 定义观察接口
*/
interface Subject
{
    public function Attach($Observer); //添加观察者
    public function Detach($Observer); //踢出观察者
    public function Notify(); //满足条件时通知观察者
    public function SubjectState($Subject); //观察条件
}

/**
* 观察类的具体实现
*/
class Boss Implements Subject 
{
    public $_action;
    
    private $_Observer;
    
    public function Attach($Observer)
    {
        $this->_Observer[] = $Observer;
    }
    
    public function Detach($Observer)
    {
        $ObserverKey = array_search($Observer, $this->_Observer);
        
        if($ObserverKey !== false)
        {
            unset($this->_Observer[$ObserverKey]);
        }
    }
    
    public function Notify()
    {
        foreach($this->_Observer as $value )
        {
            $value->Update();
        }
    }
    
    public function SubjectState($Subject)
    {
        $this->_action = $Subject;
    }
}

/**
* 抽象观察者
*
*/
abstract class Observer
{
    protected $_UserName;
    
    protected $_Sub;
    
    public function __construct($Name,$Sub)
    {
        $this->_UserName = $Name;
        $this->_Sub = $Sub;
    }
    
    public abstract function Update(); //接收通过方法
}

/**
* 观察者
*/
class StockObserver extends Observer
{
    public function __construct($name,$sub)
    {
        parent::__construct($name,$sub);
    }
    
    public function Update()
    {
        echo $this->_Sub->_action.$this->_UserName." 你赶快跑...";
    }
}

$huhansan = new Boss(); //被观察者

$gongshil = new StockObserver("三毛",$huhansan); //初始化观察者

$huhansan->Attach($gongshil); //添加一个观察者
$huhansan->Attach($gongshil); //添加一个相同的观察者
$huhansan->Detach($gongshil); //踢出基中一个观察者

$huhansan->SubjectState("警察来了"); //达到满足的条件

$huhansan->Notify(); //通过所有有效的观察者
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息