简单的一句话就是,多个不同类去执行方法名相同的代码。
实现: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->register(new Pink());
$action->notify();
//结果:
狗吃骨头
猫吃鱼
猪吃了睡,睡了吃
网友评论