<?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 name="code" class="php">/* 添加第二个视察者花农 */<?php
/**
1. 概述
又称为宣布-定阅(Publish-Subscrib