沧海遗著SPL之SplSubject和SplObserver

 想写一些关于SPL的东西,不知道怎么开始,就挑了个最简单的,写写SplSubject和SplObserver的使用。

提纲

1. 什么时观察者模式。

2.观察者模式用到的接口

3. PHP怎么使用观察者模式

什么是观察都模式?

这里有一篇文章写的还是不错的,描述了观察者模式。http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html

观察者模式就是一种订阅/发布模式,用来解决一些类的紧耦合关系的一种方法。比如我有一些东西要发布,如果你对我发布的东西感兴趣你就来订阅,当我真的发布的时候我就发一个通知给那些订阅了的人让它们自己来取。这样一来,我和订阅者之间的耦合度就很低了。

观察者模式用到的接口

一般观察者模式只需要两个接口,一个是Subject接口,它主要的职责就是把订阅者添加进来,删除订阅者,通知订阅者。另外一个就是Observer,它的职责就是等待Subject通知它过来取消息。Spl中给出了两个接口可以使我们可以不用自己定义Subject和Observer接口,它们分别是

SplSubject {
/* 方法 */
abstract public void attach ( SplObserver $observer )
abstract public void detach ( SplObserver $observer )
abstract public void notify ( void )
}
SplObserver {
/* 方法 */
abstract public void update ( SplSubject $subject )
}

PHP怎么使用观察者模式

我们要做的就是实现这两个接口,然后把SplObserver的实例注册到SplSubject实例里面去。

我这里用一个例子来说明这个过程。

<?php
class MessageSubject implements SplSubject 
{
	protected $_msg;
	
	protected $_observers;
	
	function __construct()
	{
		$this->_observers = new SplObjectStorage();
	}
	
	public function attach( SplObserver $observer )
	{
		$this->_observers->attach($observer);
	}
	
	public function detach( SplObserver $observer )
	{
		$this->_observers->detach($observer);
	}
	
	public function notify()
	{
		foreach($this->_observers as $observer) {
			$observer->update($this);
		}
	}
	
	public function addNewMessage($msg)
	{
		$this->_msg = $msg;
	}
	
	public function getMessage()
	{
		return $this->_msg;
	}
}

// 将消息发送到微信平台
class WeixinSender implements SplObserver
{
	public function update(SplSubject $subject)
	{
		echo "Message is sent to weixin: ", $subject->getMessage(), "
"; } } // 将消息发送到短信 class SMSSender implements SplObserver { public function update(SplSubject $subject) { echo "Message is sent by SMS: ", $subject->getMessage(), "
"; } } // 将消息发送到邮箱 class MailSender implements SplObserver { public function update(SplSubject $subject) { echo "Message is sent by email: ", $subject->getMessage(), "
"; } } $message = new MessageSubject(); //订阅消息 $message->attach(new WeixinSender()); $message->attach(new SMSSender()); $message->attach(new MailSender()); $message->addNewMessage("Hi, welcome to my site : http://www.zeroplace.cn/"); // 通知消息 $message->notify();

这样就能保持MessageSubject和各种Sender们的低耦合,比如你有一个新的消息发布渠道要添加进来只需要让它实现SplObserver接口,然后将它添加到SplSubejct的订阅列表里面来就可以了。

 

 点击下载此文件



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 6627