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.'浇花 ';
}
}
/* 添加第一个观察者花农 */
$subject = new Flower();
$observer1 = new LoveFlowerPerson('wlt');
$subject->attach($observer1);
<pre class="code">/* 添加第二个观察者花农 */
ログイン後にコピー
$observer2 = new LoveFlowerPerson('wlb');$subject->attach($observer2);$subject->notify(); // 主题变化,通知观察者echo '删除掉一个花农
'; $subject->detach($observer2);$subject->notify(); // 主题变化,通知观察者