观察者模式的PHP示例代码,便于快速理解该设计模式。
- 创建
被观察者
模型。
//被观察者抽象类
abstract class Subject{
//观察者列表
private $observerList = [];
//注册观察者
public function attachObserver($observer){
$this ->observerList[] = $observer;
}
//更新观察者
public function notifyObservers(){
foreach($this ->observerList as $v){
$v ->update();
}
}
}
//主角类(实现抽象类)
class Hero extends Subject{
public function move(){
echo "主角向前移动\n";
$this ->notifyObservers();
}
}
2.创建 观察者
模型。
//观察者接口类
interface Observer {
//待实现的更新函数
function update();
}
//怪物类
class Monster implements Observer {
//更新函数
public function update(){
if($this ->inRange()){
echo "怪物 对主角攻击!\n";
}
}
//主角是否在范围内,此处省略
private function inRange(){
return true;
}
}
//陷阱类
class Trap implements Observer {
public function update(){
if($this ->inRange()){
echo "陷阱 困住主角!\n";
}
}
private function inRange(){
return true;
}
}
//宝物类
class Treasure implements Observer {
public function update(){
if($this ->inRange()){
echo "宝物 为主角加血!\n";
}
}
private function inRange(){
return true;
}
}
- 实例化调用。
//实例化对象
$hero = new Hero();
$monster = new Monster();
$trap = new Trap();
$treasure = new Treasure();
//注册观察者
$hero ->attachObserver($monster);
$hero ->attachObserver($trap);
$hero ->attachObserver($treasure);
//移动事件
$hero ->move();
- 结果
PS D:\Users\admin\Desktop> php index.php
主角向前移动
怪物 对主角攻击!
陷阱 困住主角!
宝物 为主角加血!
参考: https://mp.weixin.qq.com/s/JHIzGc1c0EyT-LfuUhyTtA