ホームページ > バックエンド開発 > PHPチュートリアル > PHP でのデザイン パターン - Observer Pattern_PHP チュートリアル

PHP でのデザイン パターン - Observer Pattern_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:05:47
オリジナル
1029 人が閲覧しました

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 LoveFflowerperson('wlb');$subject->attach($observer2);$subject->notify(); // 件名が変更され、オブザーバーに通知 echo '花農家を削除します
'; detach($observer2);$subject->notify(); // サブジェクトの変更、オブザーバーに通知 リーリー

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/962643.html技術記事 php のデザインパターンの 1 つ - オブザーバーパターン Observers[] = $observer;} // オブザーバー(花を見る人)を削除 public function detach(Observer $observer){if(in_array($observer,$this) -> 観察してください...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート