设计模式学习(二)、观察者模式

1观察者模式的概念:

在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖你它的对象都回收到通知,并自动更新。

2.观察者模式的结构图

3.观察者模式角色说明

抽象主题(subject)角色:它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象,实现抽象主题所要求的注册、移出、通知接口;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者(Oberver)角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体观察者(ConcreteOberver)角色:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

4..观察者模式的实现

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 16-10-11
 * Time: 上午11:56
 */
interface Subject
{
    public function register($observer);
    public function notify();
    public function remove($observer);
}

interface Observer
{
    public function update();
}

Class ConcreteSubject implements Subject
{
    public $observerArr;
    public function register($observer){
        if(!in_array($observer,$this->observerArr))
            $this->observerArr[] = $observer;
    }
    public function remove($observer){
        if(in_array($observer,$this->observerArr))
            $this->observerArr = array_merge(array_diff($this->observerArr, array($observer)));
    }
    public function notify(){
        foreach($this->observerArr as $oberver)
            $oberver->updade();
    }
}
Class ConcreteObserver implements Observer
{
    public function __construct($subject){
        $subject->register($this);
    }
    public function update(){
        echo 'concrete observer is update';
    }
}

$subject = new ConcreteSubject();
$observer = new ConcreteObserver($subject);
$subject->notify();
原文地址:https://www.cnblogs.com/huixuexidezhu/p/5970550.html