PHP设计模式之—-观察者模式

一、概述

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);

 

  

相关文章