一、概述
1、观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。
2、场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码。
观察者模式实现了低耦合,非侵入式的通知与更新机制。
3、观察者模式包含的角色:
??? ①Subject: 目标
②Observer: 观察者
③ConcreteSubject: 具体目标
④ConcreteObserver: 具体观察者
二、代码实现
1)抽象观察目标
/* * 抽象观察目标,定义观察目标要实现的方法 * */abstract class Subject{ ???//定义数组存储观察目标 ???protected $observers = array(); ???//添加观察者 ???abstract public function addObserver(Observer $observer); ???//删除观察者 ???abstract public function delObserver(Observer $observer); ???//满足条件时通知所有观察者的操作 ???abstract public function notify(); ???//发起通知的条件 ???abstract public function condition($num);}
2)观察者接口
/** * 观察者接口,定义所有观察者共同具有的操作——执行修改 */interface Observer{ ???function update();}
3)具体观察目标
/* * 具体观察目标 */class ConcreteSubject extends Subject{ ???//添加观察者 ???public function addObserver(Observer $observer) ???{ ???????$this->observers[] = $observer; ???} ???//移除观察者 ???public function delObserver(Observer $observer) ???{ ???????$key = array_search($observer, $this->observers); ???????if ($key !== false) { ?//注意不要写成!=,表达式0!=flase为flase ???????????unset($this->observers[$key]); ???????} ???} ???//通知所有观察者去操作 ???public function notify() ???{ ???????foreach ($this->observers as $key => $value) { ???????????$value->update(); ???????} ???} ???//发起通知的条件 ???public function condition($num) ???{ ???????if ($num > 100) { ???????????$this->notify(); ???????} ???}}
4)具体观察者
/* * 具体观察者:观察者A * */class ConcreteObserverA implements Observer{ ???function update() ???{ ???????echo "A报告:敌军超过一百人了,快撤!<br>"; ???} ???//其他函数 ???function eat() ???{ ???????echo "A在吃饭"; ???}}/* * 具体观察者:观察者B * */class ConcreteObserverB implements Observer{ ???function update() ???{ ???????echo "B报告:敌军超过一百人了,快撤!<br>"; ???} ???//其他函数 ???function sleep() ???{ ???????echo "B在睡觉"; ???}}
5)测试
//测试$a ??????= new ConcreteObserverA();$b ??????= new ConcreteObserverB();$subject = new ConcreteSubject();$subject->addObserver($a);$subject->addObserver($b);$subject->condition(1000);
PHP设计模式之----观察者模式
原文地址:https://www.cnblogs.com/jxl1996/p/10185267.html