登录  /  注册

php中的设计模式之--观察者模式_PHP教程

php中文网
发布: 2016-07-13 10:05:47
原创
807人浏览过

php中的设计模式之--观察者模式

<?php  

/**  

1. 概述

  又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式

2. 解决的问题

  将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。

3. 模式中的角色

  3.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

  3.2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

  3.3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

  3.4 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

4 . 简单的来说观察者模式有两个角色(主题和观察者),其中主题可以理解万为被观察者; 如果主题发生变化,就会通知观察者,观察者就会更新自己; 

举例说明 ,花(具体对象,或者被观察者) 养花的人就是观察者,如果花发生变化(叶子枯萎需要浇水),观察者就会做出反应浇花; 

*/

 //(1)抽象主题(Subject)
interface  Subject {
	
	// 添加观察者
	public function attach(Observer $observer)  ;
	// 删除观察者 
	public function detach(Observer $observer);
	
//	向观察者(们)发出通知
	public function notify();
	
}


// (2) 抽象观察者

interface Observer{
	// 更新方法
	 public function dosometing(); 
}



// 具体的花作为主体

class Flower implements Subject{
	
	// 此为所有的观察者对象数组 
	private $observers = NULL ;   
	
	// 添加观察者(看花的人) 
	public function attach(Observer $observer) {
		$this->observers[] = $observer ;
	}
	
  // 删除观察者 (看花的人)
	public function detach(Observer $observer){
		
		if(in_array($observer,$this->observers)){
			$index = array_search($observer, $this->observers);
		    unset($this->observers[$index]);
            return TRUE;
		}
		return false; 
		
	}
	
//	向观察者(们)发出通知
	public function notify(){
		
		foreach($this->observers as $observer){
			$observer->dosometing(); 
		}
	}
	
}



// 具体的人 

class LoveFlowerPerson implements Observer{
	 private $name  ;
	
	 function __construct($sName){
		 $this->name =$sName ;
	 }
	 public function dosometing(){
		 
	  echo  $this->name.&#39;浇花  &#39;;		
	 }
	 
}



/* 添加第一个观察者花农 */

$subject = new Flower();
$observer1 = new LoveFlowerPerson(&#39;wlt&#39;);
$subject->attach($observer1);

<pre class="code">/* 添加第二个观察者花农 */
登录后复制
$observer2 = new LoveFlowerPerson('wlb');$subject->attach($observer2);$subject->notify(); // 主题变化,通知观察者echo '删除掉一个花农
'; $subject->detach($observer2);$subject->notify(); // 主题变化,通知观察者
登录后复制

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/962643.htmlTechArticlephp中的设计模式之--观察者模式 observers[] = $observer ;} // 删除观察者 (看花的人)public function detach(Observer $observer){if(in_array($observer,$this->observ...
智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号