PHP 观察者模式

 

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

 

【观察者模式中主要角色】

1.抽象主题(Subject)角色: 抽象主题提供了增加,删除观察者,通知观察者对象的接口。
2.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己。
3.具体主题(ConcreteSubject)角色:存储相关状态到具体观察者对象,当具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色是抽象主题(Subject)角色实现。
4.具体观察者(ConcretedObserver)角色:实现抽象观察者角色(Observer)所要求的更新接口。

主题也可以理解为被观察者,就像赌场的每个场子一样,而观察者就是每个场子里的赌徒,当每个场子的荷官摇完骰子,赌徒们都会有一系列的动作。

【观察者模式PHP示例】

 

interface Subject{                       # 赌场的环境能干什么
    public function attach($observer);  # 来赌徒
    public function detach($observer);  # 赌徒走了
    public function doIt();              # 开盘了
}

class ConcreteSubject implements  Subject {   # 赌场的一个桌子
    public $obj = [];

    public function attach($observer){
        if(!in_array($observer,$this->obj)){
            $this->obj[] = $observer;
        }
    }

    public function detach($observer){
        $key = array_search($observer,$this->obj);
        if($key){
            unset($this->obj[$key]);
        }
    }

    public function doIt(){
        if(!empty($this->obj)){
            foreach ($this->obj as $v){
                $v->go();
            }
        }
    }
}


interface Observer{    # 赌场的人能干什么
    public function go();
}


class ConcreteObserver1 implements Observer {  # 赌徒1

    public function go(){
        echo "我压大";
    }
}


class ConcreteObserver2 implements Observer {  # 赌徒2

    public function go(){
        echo "我压小";
    }
}

$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver1();
$observer2 = new ConcreteObserver2();
$subject->attach($observer1);   # 赌徒1过来了
$subject->attach($observer2);   # 赌徒2过来了
$subject->doIt();   # 开盘了

  

  

posted on 2017-01-03 15:24  莫小安  阅读(285)  评论(0编辑  收藏  举报

导航