原文作者: xingguang
原文链接:https://www.tiance.club/post/960570916.html
/**
* 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。
* 比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
* 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
*/
一般来说有两个接口类,用以框定观察者模式:
- 一个被观察者接口类(一般申明有三个必须方法:1.添加观察者对象的方法,2.删除观察者对象的方法 ,3.通知观察者进行 相应执行的方法)
- 一个观察者接口类(一般只有一个必须方法,就是执行)
具体代码实现范例
1、标题添加观察者接口和被观察者接口
// 被观察者接口
interface Subject{
public function register(Observer $observer); //添加(注册)观察者对象
public function detach(Observer $observer); //删除观察者对象
public function notify(); //通知观察者执行相应功能
}
// 观察者接口
interface Observer{
public function watch(); //观察者要执行的方法
}
2、被观察者继承类
// 被观察者继承类
class Action implements Subject{
public $_observers=array(); //用于存储观察者对象
//用于添加(注册)观察者对象
public function register(Observer $observer){
$this->_observers[]=$observer;
}
//用于删除观察者对象
public function detach(Observer $observer){
$index = array_search($observer, $this->_observers);
if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
return FALSE;
}
unset($this->_observers[$index]);
return TRUE;
}
//通知各观察者
public function notify(){
//****重点,其实就是循环中执行各观察这对象的watch方法,不同功能方法内容不同但方法名相同
foreach ($this->_observers as $observer) {
$observer->watch();
}
}
}
原文作者: xingguang
原文链接:https://www.tiance.club/post/960570916.html
3、观察者继承类
这也是具体的业务逻辑实现代码,如注册完之后给用户发邮件短信之类的。
// cat观察者继承类
class Cat implements Observer{
public function watch(){
echo "Cat watches TV<hr/>";
}
}
//dog观察者继承类
class Dog implements Observer{
public function watch(){
echo "Dog watches TV<hr/>";
}
}
//people观察者继承类
class People implements Observer{
public function watch(){
echo "People watches TV<hr/>";
}
}
4、具体实例化调用代码
public function testObserver(){
$action=(new Action());
$action->register(new Cat());
$action->register(new Dog());
$action->notify();
}
具体的应用场景如用户注册完后给用户发邮件和短信,这里可以通过观察者模式给通过将邮件和短信这两个观察者注册到被观察者中,判断注册完毕后直接调用notify() 方法直接通知各观察者。
原文作者: xingguang
原文链接:https://www.tiance.club/post/960570916.html