首先得有两个接口类,用以框定观察者模式,
一个被观察者接口类(一般申明有三个必须方法:1.添加观察者对象的方法,2.删除观察者对象的方法 ,3.通知观察者进行 相应执行的方法),
一个观察者接口类(一般只有一个必须方法,就是执行)
原文连接: https://blog.youkuaiyun.com/leo_jk/article/details/84635305
<?php
// 被观察者接口
interface Subject{
public function register(Observer $observer); //添加(注册)观察者对象
public function detach(Observer $observer); //删除观察者对象
public function notify(); //通知观察者执行相应功能
}
// 观察者接口
interface Observer{
public function watch(); //观察者要执行的方法
}
// 被观察者继承类
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();
}
}
}
// 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/>";
}
}
// 应用实例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();