//通知者接口
interface Subject {
function attach($observer);
function detach($observer);
function notify();
}
//老板
class Boss implements Subject {
//同事列表
private $observers = array();
private $action;
private $subjectState;
public function __set($key, $value) {
$this->$key = $value;
}
public function __get($key) {
if(isset($this->$key)) {
return $this->$key;
} else {
return NULL;
}
}
//增加
public function attach($observer) {
array_push($this->observers, $observer);
}
//减少
public function detach($observer) {
$insex = array_search($observer, $this->observers);
unset($this->observers[$insex]);
}
//通知
public function notify() {
foreach($this->observers as $v) {
$v->update();
}
}
}
//抽象观察者
abstract class Observer {
protected $name;
protected $sub;
public function __construct($name, $sub) {
$this->name = $name;
$this->sub = $sub;
}
public abstract function update();
}
//看股票的同事
class StockObserver extends Observer {
public function __construct($name, $sub) {
parent::__construct($name, $sub);
}
public function update() {
echo $this->sub->subjectState.$this->name.'关闭股票行情,继续工作。';;
}
}
//看NBA的同事
class NBAObserver extends Observer {
public function __construct($name, $sub) {
parent::__construct($name, $sub);
}
public function update() {
echo $this->sub->subjectState.$this->name.'关闭NBA直播,继续工作。';;
}
}
//客户端代码
//老板胡汉三
$huhansan = new Boss();
//看股票的同事
$tongshi1 = new StockObserver('魏关宅', $huhansan);
//看NBA的同事
$tongshi2 = new NBAObserver('易管查',$huhansan);
$huhansan->attach($tongshi1);
$huhansan->attach($tongshi2);
$huhansan->detach($tongshi1);
//老板回来
$huhansan->subjectState = '我胡汉三回来了!';
//发出通知
$huhansan->notify();
大话设计模式-观察者模式
最新推荐文章于 2024-06-18 09:14:46 发布