观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
【观察者模式中主要角色】
1.抽象主题(Subject)角色: 抽象主题提供了增加,删除观察者,通知观察者对象的接口。
2.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己。
3.具体主题(ConcreteSubject)角色:存储相关状态到具体观察者对象,当具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色是抽象主题(Subject)角色实现。
4.具体观察者(ConcretedObserver)角色:实现抽象观察者角色(Observer)所要求的更新接口。
主题也可以理解为被观察者,就像赌场的每个场子一样,而观察者就是每个场子里的赌徒,当每个场子的荷官摇完骰子,赌徒们都会有一系列的动作。
【观察者模式PHP示例】
interface Subject{ # 赌场的环境能干什么 public function attach($observer); # 来赌徒 public function detach($observer); # 赌徒走了 public function doIt(); # 开盘了 } class ConcreteSubject implements Subject { # 赌场的一个桌子 public $obj = []; public function attach($observer){ if(!in_array($observer,$this->obj)){ $this->obj[] = $observer; } } public function detach($observer){ $key = array_search($observer,$this->obj); if($key){ unset($this->obj[$key]); } } public function doIt(){ if(!empty($this->obj)){ foreach ($this->obj as $v){ $v->go(); } } } } interface Observer{ # 赌场的人能干什么 public function go(); } class ConcreteObserver1 implements Observer { # 赌徒1 public function go(){ echo "我压大"; } } class ConcreteObserver2 implements Observer { # 赌徒2 public function go(){ echo "我压小"; } } $subject = new ConcreteSubject(); $observer1 = new ConcreteObserver1(); $observer2 = new ConcreteObserver2(); $subject->attach($observer1); # 赌徒1过来了 $subject->attach($observer2); # 赌徒2过来了 $subject->doIt(); # 开盘了