php

位置:IT落伍者 >> php >> 浏览文章

php设计模式之观察者模式的应用详解


发布日期:2024年03月03日
 
php设计模式之观察者模式的应用详解

观察者模式定义对象间一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并自动更新  
观察者类
抽象主题角色主题角色将所有对观察者对象的引用保存在一个集合中每个主题可以任意多个观察者抽象主题提供了增加和删除观察者对象的接口
抽象观察者角色为所有的具体观察者定义一个接口在观察的主题发生改变时更新自己
具体主题角色存储相关状态到具体观察者对象当具体主题的内部状态发生改变时给所有登记过的观察者发出通知具体主题角色通常用一个具体子类实现
具体观察者角色存储一个具体主题对象存储相关状态实现抽象观察者角色所要求的更新接口以使得其自身状态和主题的状态保持一致
作用
观察者模式的耦合度较小
支持广播通信

代码如下:
<?php
//抽象主题
interface  Subject{
public function attach($observer);
public function  detach($observer);
public function notifyObservers();
}
//具体主题
class  ConcreateSubject implements Subject{
private $_observers;
public function  __construct(){
$this>_observers = array();
}

public function  attach($observer){
return  array_push($this>_observers$observer);
}

public function  detach($observer){
$index =  array_search($observer$this>_observers);
if($index === false ||  !array_key_exists($index$this>_observers)){
return  false;
}
unset($this>_observer[$index]);
return  true;
}

public function  notifyObservers(){
if(!is_array($this>_observers)){
return  false;
}
foreach($this>_observers as  $observer){
$observer>update();
}
return  true;
}
}

//抽象观察者
interface Observer{
public function  update();
}
//具体观察者
class ConcreteObserver implement  Observer{
private $_name;
public function  __construct($name){
$this>_name = $name;
}

public function  update(){
echo Observer$this>_namehas  notified<br/>;
}
}

//客户端
class Client{
public static  function main(){
$subject = new  ConcreteSubject();
//新增第一个观察者
$observer = new  ConcreteObserver(Martin);
$subject>attach($observer);
//通知
$subject>notifyObservers();

//新增第二个观察者
$observer  = new  ConcreteObserver(jaky);
$subject>attach($observer);
//通知
$subject>notifyObservers();

//删除观察者
$subject>deatch($observer);
//通知
$subject>notifyObservers();
}
}

Client::main();
?>               

上一篇:PHP5教程之文件操作

下一篇:用PHP与XML联手进行网站编程