码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式:观察者模式(发表-订阅(Publish/Subscribe)模式)

时间:2015-08-28 15:20:22      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

    观察者模式定义:定义对象间一种一对多的依赖关系,当这个对象状态发生变化时,则所有依赖它的对象都会得到通知并被自动更新(注:这里的依赖是一种聚合的方式)。  笔者对于这些定义什么的其实相当的不感冒,虽然这个写得的确很不错的样子。下面直接上代码运行效果图,通过将’男孩子们打望美女淋浴‘的例子,来讨论下该模式。

 

技术分享

 

代码贴上:     

 

<?php 


//被打望者接口  实现该接口的对象都可以视为实际被打望的妹子
interface IbeatifulGirl{
    
    public function join(IBoy $boy);         //添加打望者
    
    public function goaway(IBoy $boy);       //干掉打望者
    
    public function notify();                //通知打望者
    
}

//来了一个要被打望的漂亮妹子
class  BeatifulGirl implements IbeatifulGirl{
    
    private $boys;  //定义打望者集合(这里的打望者有服了,妹子有消息都会受到通知。)
    
    function __construct() {
            $this->boys = array();  //初始化集合
    }
    
    //添加打望者(不然怎么通知呢?)
    public   function join(IBoy $boy){
              if(!in_array($boy->name,array_keys($this->boys))){
                      $this->boys[$boy->name]=$boy;
              }
    }
    
    //干掉打望者(被妹子发现了,或者长太丑,不允许打望了。)
    public function  goaway(IBoy $boy){
         if(in_array($boy->name,array_keys($this->boys))){
                  unset($this->boys[$boy->name]);
          }
    }
    
    //通知打望者,告诉他们做好准备
    public function notify(){
        foreach ($this->boys as $boy){
            $boy->update();
        }
    }
    
    //被打望的漂亮妹子开始淋浴了
    public function  shower(){
        
        echo ‘美女开始淋浴了<br/>‘;
        
         //通知所有的打望者
         $this->notify();      
    }
}


//打望者接口  实现该接口的对象都可以视为实际去打望的人
interface  IBoy{
    
    public function update();    //收收到妹子的消息的时候,自己立马做准备,你懂的。
    
}

//张三来打望来了
class Zhangsan implements IBoy{
    public $name;
    function __construct($name) {
            $this->name = $name;
    }
    
    //张三收到通知的行为:可能是太远了,所以提前准备望远镜。
    public function update(){
            echo $this->name.‘received:准备望远镜,并开始打望。<br/>‘;
    }
}

//李四来打望来了
class Lisi implements IBoy{
    public $name;
    function __construct($name) {
            $this->name = $name;
    }
    
    //李四收到通知的行为:难得有机会,得准备好照相机。
    public function update(){
            echo $this->name.‘received:准备照相机,并开始照相。<br/>‘;
    }
}

//王五来打望来了
class Wangwu implements IBoy{
    public $name;
    function __construct($name) {
            $this->name = $name;
    }
    
    //王五收到通知的行为:哥来发个大招,摄影机记录下来得了。
    public function update(){
            echo $this->name.‘received:准备摄影机,并开始摄影。。<br/>‘;
    }
}


//浴室来了个妹子
$girl = new BeatifulGirl();
$girl->join(new Zhangsan(‘张三‘));             //张三要打望
$girl->join(new Lisi(‘李四‘));                 //李四要打望
$girl->join(new Wangwu(‘王五‘));               //王五要打望

//美女开始淋浴 福利来了 !!!
$girl->shower();

echo ‘皆大欢喜!我也是醉了!‘;

附上百度的观察者模式通用类图。文中淋浴的女孩就是具体被观察者,张三李四王五就是具体的观察者。

 技术分享  

 

优点:对象之间松耦合,可以交互,不许知道彼此的细节。被观察者中可聚合多个观察者并全部发出通知,并不关心通知后观察者你要做什么,怎么做。(反正我开始淋浴了,随便你来不来围观),支持‘广播通信’,并符合‘开闭原则’要求。

缺点:如果被观察者有很多观察者,通知可能会话费很多时间;如果观察者和被观察者循环依赖的话,可能导致系统崩溃;一个观察者多个被观察者的情况下,可能导致通知响应时间长或者无响应。(这种情况可以考虑异步架构或者留充足资源做同步架构)

使用场合:如定义所言,当一个对象状态变化,会引起多方的状态变化的场景即可使用。

 

笔者第一次写博客,有点洋气的感觉。不过由于水平有限,如有问题,大家一起讨论。

 

联系方式:

姓名:24K纯屌丝

QQ:1418197673

Email:devenv@sina.cn

设计模式:观察者模式(发表-订阅(Publish/Subscribe)模式)

标签:

原文地址:http://www.cnblogs.com/24kcds/p/observer.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!