美文网首页
php实现 观察者模式

php实现 观察者模式

作者: 我爱张智容 | 来源:发表于2021-05-06 11:32 被阅读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();
    //结果:
    狗吃骨头
    猫吃鱼
    猪吃了睡,睡了吃
    

    相关文章

      网友评论

          本文标题:php实现 观察者模式

          本文链接:https://www.haomeiwen.com/subject/ojvgcltx.html