• 观察者模式


      观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

      类结构图如下:

    观察者模式类结构图

      举个例子,有一个报警系统,监控到异常后需要报警给运维人员,那么运维人员是观察者,我也可以把老板添加到观察者里,让老板也收到这个报警(实事上老板是不会关心到这种鸡毛蒜皮的小事的~~)。

    <?php
    //被观察者抽象类
    abstract class AbstractSubject{
        private $observers = array();
        public function Attach($o){
            $this->observers[] = $o;
        }
        public function Detach($o){
            foreach($this->observers as $k=>$v){
                if($v == $o){
                    unset($this->observers[$k]);
                    break;
                }
            }
        }
        public function Notify($info){
            foreach($this->observers as $v){
                $v->Update($info);
            }
        }
    }
    //被观察者具体实现
    class ConcreteSubject extends AbstractSubject{
        public function baojing($str){
            $this->Notify($str);
        }
    }
    
    //抽象观察者类
    abstract class AbstractObserver{
        abstract public function Update($info);
    }
    //观察者具体类1
    class ConcreteObserver extends AbstractObserver{
        public function Update($info){
            echo "检测到 ".$info;
        }
    }
    //观察者具体类2
    class laoban extends AbstractObserver{
        public function Update($info){
            echo "老板,".$info;
        }
    }
    
    //场景类
    class Client{
        public function run(){
            $subject = new ConcreteSubject;
            $observer = new ConcreteObserver;
            $subject->Attach($observer);
            $laoban = new laoban;
            $subject->Attach($laoban);
            //$subject->Detach($laoban);
            $subject->baojing("啦啦啦 内存快撑暴啦!
    ");
        }
    }
    
    Client::run();

      

  • 相关阅读:
    jQuery火箭图标返回顶部代码
    质数和分解(完全背包)
    CodeForces
    FZU
    FZU
    Pets(匈牙利算法)
    Construct a Matrix (矩阵快速幂+构造)
    绝世好题(线性dp)
    String painter (区间dp)
    Funny Positive Sequence (思维+前缀)
  • 原文地址:https://www.cnblogs.com/zhutianpeng/p/4234288.html
Copyright © 2020-2023  润新知