`
chinagdvea
  • 浏览: 126468 次
  • 性别: Icon_minigender_1
  • 来自: 韶关
社区版块
存档分类
最新评论

观察者模式

 
阅读更多
<?php
	#通知者类
	class Sender
	{
		static private $instance = null;
		private $observers = array();
		private $message = 'default message';
		
		#获取通知者实例
		public static function getInstance()
		{
			if ( self::$instance == null )
			{
				self::$instance = new Sender();
			}
			
			return self::$instance;
		}
		
		#设置新消息,并通知所有观察者
		public function setMessage( $newMessage )
		{
			$this->message = $newMessage;
		
			$this->notifyObservers();
		}
		
		#注册观察者
		public function registerObserver( $observer )
		{
			if( is_array( $observer ) )
			{
				foreach( $observer as $item )
				{
					if( $item instanceof Observer )
					{
						$this->observers[] = $item;
					}
				}
			} else
			{
				if( $observer instanceof Observer )
				{
					$this->observers[] = $observer;
				}
			}
		}
		
		#通知所有观察者
		private function notifyObservers()
		{
			foreach( $this->observers as $observer )
			{
				$observer->notify( $this->message );
			}
		}
		
		#获取现有的消息
		public function getMessage()
		{
			return $this->message;
		}
	}
	
	#观察者接口
	interface Observer
	{
		function notify( $message );
	}
	
	#观察者类
	class Reciever implements Observer
	{
		public function notify( $message )
		{
			echo $message . ' updated' . '<br>';
		}
	}
	
	#测试代码
	$observers = array();
	
	$reciever1 = new Reciever();
	$observers[] = $reciever1;
	$reciever2 = new Reciever();
	$observers[] = $reciever2;
	
	$sender = Sender::getInstance();
	
	$sender->registerObserver( $observers );
	
	$message = $sender->getMessage();
	echo $message . '<br>';
	
	$sender->setMessage( 'new message' );
?>


输出
引用
default message
new message updated
new message updated
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics