观察者模式(PHP)

观察者模式的PHP示例代码,便于快速理解该设计模式。

  1. 创建 被观察者模型。
//被观察者抽象类
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;
	}
}
  1. 实例化调用。
//实例化对象
$hero = new Hero();
$monster = new Monster();
$trap = new Trap();
$treasure = new Treasure();
//注册观察者
$hero ->attachObserver($monster);
$hero ->attachObserver($trap);
$hero ->attachObserver($treasure);
//移动事件
$hero ->move();
  1. 结果
PS D:\Users\admin\Desktop> php index.php
主角向前移动
怪物 对主角攻击!
陷阱 困住主角!
宝物 为主角加血!

参考: https://mp.weixin.qq.com/s/JHIzGc1c0EyT-LfuUhyTtA

猜你喜欢

转载自blog.csdn.net/qq_36453564/article/details/107314310