设计模式之观察者模式

来源:互联网 发布:儿童马甲淘宝 编辑:程序博客网 时间:2024/06/16 22:43

一.定义

观察者模式 定义了对象之间的一对多的依赖关系,当某一个对象改变时候 ,它的所有依赖者都会收到通知并自动更新

有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种

二. 使用场景

购票、订阅报纸、订阅牛奶等 当主题类某个业务逻辑发生时通知观察者对象,每个观察者执行自己的业务逻辑。

三.观察者要素 

要有被观察的接口(被观察者) 和 被通知对象(观察者)  

三观察者思想的优缺点

观察者模式的优点:

1.在观察者和被观察者之间建立了一个抽象的松耦合

2.观察者模式支持广播通讯,被观察者会像所有的观察者发生通知

观察者模式的缺点:

1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

2.如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。

3.如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。

4.虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。

四代码说明

本代码是本人原创 用观察者模式思想实现气象站 的功能  

<?php
<?php/** * Created by PhpStorm. * User: guochunyan * Date: 2017/3/18 * Time: 14:12 * 观察者模式: * 定义: *  观察者模式典型实现方式(拿天气预报举例): * 1、定义2个接口:观察者(通知)接口、被观察者(主题)接口 * 2、定义2个类,观察者对象实现观察者接口、主题类实现被观者接口 * 3、创建天气预报对象(被观察者) * 4、创建一个观察者 && 加入观察者队列中 * 5、数据变化调用setmeasurementsChanged 通知观察者 * * 应用场景:购票、订阅报纸、订阅牛奶 *///主题 类class weatherData implements subject {    private   $_observer  = array();    private   $_temperature = 0 ;    private   $_humidity    = 0 ;    private   $_presssure   = 0 ;    //增加 观察者    public function  registerObserver($observer){        //这里需要增加去重机制----        $this->_observer[] = $observer;    }    //移除 观察者    public function  removeObserver($observer){        unset($this->_observer[$observer]);        if(!empty($this->_observer)){            foreach ($this->_observer as $key =>  $observers){                if($observer == $observers){                    unset($this->_observer[$key]);                    continue;                }            }        }    }    //通知 观察者    public function  notifyObserver(){        if(!empty($this->_observer)){            foreach ($this->_observer as  $observer){                $observer->update();            }        }    }    //调用 更改    public function  measurementsChanged(){        $this->notifyObserver();    }    //通知 接口    public function setmeasurementsChanged($tmp, $hum, $pre){        $this->_temperature = $tmp;        $this->_humidity    = $hum;        $this->_presssure   = $pre;        $this->measurementsChanged();    }}//观察者 类class obj implements Observer{    public function  update($temp, $hum, $pres){        echo "温度:".$temp."  湿度:".$hum."  气压: ".$pres;    }}//主题接口interface subject{    public function  registerObserver($observer);    public function  removeObserver($observer);    public function notifyObserver();}//观察者接口interface Observer{    public function update($temp, $hum, $pres);}//创建一个天气预报$date = new weatherData();//生成观察者$obj_p$obj_p = new obj();//把$obj_p 放在天气预报 的被通知名单$date->registerObserver($obj_p);//气象系统有数据更新$date->setmeasurementsChanged(10,30,49);


0 0