什么是观察者模式?
简单的一句话就是,多个不同类去执行方法名相同的代码。
实现:1.定义一个观察接口,第二实现该接口里的方法。
生活中的例子:
小明观察者),狗(被观察者),猫(被观察者),牛(被观察者)
当小明看见狗,就知道它喜欢吃骨头。
当小明看见猫,就知道它喜欢吃鱼。
当小明看见牛,就知道它喜欢吃青草。
代码如下:
<?php
//观察者接口
interface ObjectTest {
//注册观察者对象
public function register(ObServerTest $obServerTest);
//删除观察者对象
public function detach(ObServerTest $obServerTest);
//通知所有的被观察者
public function notify();
}
//被观察者接口
interface ObServerTest{
public function eat();
}
//定义具体观察者类
class Action implements ObjectTest{
private $_obServersTest = [];
public function register(ObServerTest $obServerTest){
//注册对象
$this->_obServersTest[] = $obServerTest;
}
public function detach(ObServerTest $obServerTest){
$index = array_search($obServerTest,$this->_obServersTest);
if(false === $index || !array_key_exists($index,$this->_obServersTest)){
throw new \Exception('该对象不存在');
}
unset($this->_obServersTest[$index]);
}
public function notify(){
//通知所有的对象
foreach ($this->_obServersTest as $k=>$v){
$v->eat();
}
}
}
class Dog implements ObServerTest{
public function eat() { echo '狗吃骨头'."\n"; }
}
class Cat implements ObServerTest{
public function eat() { echo '猫吃鱼'."\n";
}
}
class Pink implements ObServerTest{
public function eat() { echo '猪吃了睡,睡了吃'."\n"; }
}
$action = new Action();
$action->register(new Dog());
$action->register(new Cat());
//$action->detach(new Cat()); //删除观察者对象
$action->register(new Pink());
$action->notify();
//结果: 狗吃骨头 猫吃鱼 猪吃了睡,睡了吃
//删除观察者对象猫类 结果: 狗吃骨头 猪吃了睡,睡了吃