php设计模式之调查者模式

    添加时间:2013-5-21 点击量:
    调查者模式:定义对象间一种一对多的依附关系,当一个对象的状况产生改变时,所有依附于它的对象都获得通知并主动更新。
    调查者类:

    1.抽象主题角色:主题角色将所有对调查者对象的引用保存在一个凑集中,每个主题可以随便率性多个调查者。抽象主题供给了增长和删除调查者对象的接口。

    2.抽象调查者角色:为所有的具体调查者定义一个接口,在调查的主题产生改变时更新本身

    3.具体主题角色:存储相干状况到具体调查者对象,当具体主题的内部状况产生改变时,给所有挂号过的调查者发出通知。具体主题角色凡是用一个具体子类实现。

    4.具体调查者角色:存储一个具体主题对象,存储相干状况,实现抽象调查者角色所请求的更新接口,以使得其自身状况和主题的状况对峙一致

    感化:

    1. 调查者模式的耦合度较小

    2.支撑广播通信

     



    <?php
    
    //抽象主题
    interface Subject{
    public function attach(¥observer);
    public function detach(¥observer);
    public function notifyObservers();
    }
    //具体主题
    class ConcreateSubject implements Subject{
    private ¥_observers;
    public function __construct(){
    ¥this->_observers = array();
    }

    public function attach(¥observer){
    return array_push¥this->_observers,¥observer);
    }

    public function detach(¥observer){
    ¥index = array_search¥observer¥this->_observers);
    if¥index === false || !array_key_exists¥index¥this->_observers)){
    return false;
    }
    unset¥this->_observer[¥index]);
    return true;
    }

    public function notifyObservers(){
    if(!is_array¥this->_observers)){
    return false;
    }
    foreach¥this->_observers as ¥observer){
    ¥observer->();
    }
    return true;
    }
    }

    //抽象调查者
    interface Observer{
    public function ();
    }
    //具体调查者
    class ConcreteObserver implement Observer{
    private ¥_name;
    public function __construct(¥name){
    ¥this->_name = ¥name;
    }

    public function (){
    echo Observer,¥this->_name.has notified<br/>;
    }
    }

    //客户端
    class Client{
    public static function main(){
    ¥subject = new ConcreteSubject();
    //新增第一个调查者
    ¥observer1 = new ConcreteObserver(Martin);
    ¥subject->attach(¥observer1);
    //通知
    ¥subject->notifyObservers();

    //新增第二个调查者
    ¥observer2 = new ConcreteObserver(jaky);
    ¥subject->attach(¥observer2);
    //通知
    ¥subject->notifyObservers();

    //删除调查者1
    ¥subject->deatch(¥observer1);
    //通知
    ¥subject->notifyObservers();
    }
    }

    Client
    ::main();
    ?>




    所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
    分享到: