观察者模式
构成
抽象被观察者 + 具体被观察者 + 抽象观察者 + 具体观察者
定义
被观察者具有修改观察列表 + 通知观察列表成员的能力, 观察者收到通知后对指定数据进行修改
DEMO
/*观察者模式*/
interface subject{ // 抽象被观察者
function addObservers(concreteObserver $observer);
function delObservers(concreteObserver $observer);
function doNotify();
}
// 具体被观察者
class concreteSubject implements subject
{
private $_observerList = [];
public function addObservers(concreteObserver $observer){
if(array_search($observer,$this->_observerList)===false){
$this->_observerList[] = $observer ;
}
}
function delObservers(concreteObserver $observer){
$key = array_search($observer,$this->_observerList) ;
if($key!==false){
unset($this->_observerList[$key]);
}
}
function doNotify(){
foreach ($this->_observerList as $observer) {
$observer->update();
}
}
}
interface observer{ // 抽象观察者
function update();
}
class concreteObserver implements observer // 具体观察者
{
private $name ;
function __construct($name)
{
$this ->name= $name;
}
function update(){
echo $this ->name ." is update\n";
}
}
class client
{
static function main()
{
$subject = new concreteSubject();
$observerA = new concreteObserver('observerA');
$observerB = new concreteObserver('observerB');
$observerC = new concreteObserver('observerC');
$subject->addObservers($observerA);
$subject->addObservers($observerB);
$subject->addObservers($observerC);
echo "first notify: \n";
$subject->doNotify();
$subject->delObservers($observerC);
echo "second notify: \n";
$subject->doNotify();
}
}
client::main();
网友评论