观察者模式

观察者模式

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

  类结构图如下:

观察者模式

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

<?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();