注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Copper peas ' Bolg

Keep On Moving...This Is My Life...

 
 
 

日志

 
 

【原】 PHP 设计模式十四之职责链设计模式  

2011-06-17 13:23:05|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?php
 /**
  * 老师发本子 职责链设计模式
  * 记得在上初中的时候,有一个老师非常的特别,他有一个与众不同的习惯,就是同学们的作业是边看边发,他看完一本,点评两句,然后就把本子扔给前排的同学,继续看下一本,前排的同学再把本子往后传,只到传给本子的主人。
 这个例子非常生动,当然这个案例使用观察者模式效率是最高的,就是喊名字应答,这里假设老师不想说话。案例来源http://blog.csdn.net/qinysong/archive/2006/08/26/1123200.aspx
  * 学生数量众多,如果老师来判断认人,必定会花费大量时间,老师把这个处理交给了下面的学生,解耦了关系。
  * 定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  * @anthor Chen Wei Han <csq-3@163.com>
  * @copyright Chen Wei Han 2011-6-17上午11:19:00
  * @link http://csq-3.blog.163.com
  * @package
  * @version
  */


/**
 * 书基类
 */
class Book
{
 private $name;
 public function __construct($name)
 {
  $this->name = $name;
 }
 public function Getbook()
 {
  return $this->name;
 }
}

/**
 * 抽象同学行为类
 */
abstract class abstract_Student
{
    protected  $next;
   
    public function setnext($next)
 {
  $this->next=$next;
 }
 
 abstract public function Getbook($book); 
}

/**
 * jack同学 具体类
 */
class jack extends abstract_Student

 private $name="jack";
 
 public function Getbook($book)
 { 
    if($book->Getbook()==$this->name)
    {
       echo "this is jack book!";
    }
    else
    {
       $this->next->Getbook($book);
    }
 }
}

/**
 * luse同学 具体类
 */
class luse extends abstract_Student
{
 private $name="luse";
 
 public function Getbook($book)
 { 
    if($book->Getbook()==$this->name)
    {
       echo "this is luse book!";
    }
    else
    {
       echo "nobody!";
    }
 }
}

//配置链
$luse = new luse();
$jack = new jack();
$jack->setnext($luse);

//发给jack
$jack->Getbook(new Book('luse'));

/**
 * 说点题外话:写到第十四个职责链设计模式的时候,我感觉,设计模式是为了相对降低耦合,也就是说一切从实际出发。
 * 策略模式和职责链模式都具有判断处理的能力
 * 只不过,策略模式的判断是固定统一处理,而职责链模式的判断在接收者单一灵活处理。
 * 对于多个算法的策略,想当然肯定是使用策略模式,可职责链模式也可以实现的。
 * 就这个问题:策略模式的解耦注重的是     算法之间的解耦。 增加判断必要修改switch来实例类,判断是没有解耦的。(特殊情况不讨论,比如类命名和参数同名)
 *          职责链模式的解耦注重的是  职责(算法使用的范围)判断之间的解耦,当然不同的职责对应不同的算法,那算法也解耦了。(当然也可以更好的满足算法也解耦了,算法抽象出来,这就是组合后的策略链模式,等于策略模式的switch由职责类来代替了。)
 * 职责链模式可以移除策略模式中的switch等判断,可为什么很多策略模式没有移除呢?
 * 软件的开发是维护方便,结构简单,而不是一定要满足什么面向对象的几大原则,非的解耦到极限。一切从实际出发,职责链模式的类是很多,递归下去很不好维护,没有策略来的简单,说白了就是性价比高。 性价比就是生活购物的精髓。
 * 也不是职责链模式很麻烦,每个模式都有自己的特色,比如请假的案例,因为经理可以包括1天,而总经理是2天以类,总经理是上级而且包括了经理的职责,如果这里采用策略的话,如果请假一天,策略的判断也就没有意义了。在实际生活中,总经理希望经理能解决一些他能处理的事情,这样时候,真的非职责链模式来胜任,他能灵活的处理判断的流程的顺序。
 * 总结一句话:每个模式的解耦都相对的,有专长的,毛主席的话:一切从实际出发,就如上面例子也可以使用观察者模式来处理一样。
 */

  评论这张
 
阅读(110)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018