php实现 观察者模式

2021-05-06  本文已影响0人  我爱张智容

简单的一句话就是,多个不同类去执行方法名相同的代码。

实现: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();
//结果:
狗吃骨头
猫吃鱼
猪吃了睡,睡了吃
上一篇 下一篇

猜你喜欢

热点阅读