除非注明转载,否则本博客文章皆为原创。 MSN: wfnlxp@hotmail.com QQ: 176564452

用星际学习PHP设计模式8-职责链模式

上一篇 / 下一篇  2007-04-02 09:26:57 / 个人分类:面向对象

星际的兵种属性随着对平衡性的调节,会进行修改。如果这样的话,我们就要考虑减少一个事件和具体处理的关联性。

比如一颗原子弹投下的瞬间,在杀伤范围内的部队或者建筑都会减少血,但是随着距离中心点的远近,受损程度是不同的,而且不同的兵种和建筑受损情况是不同的。

待解决的问题:原子弹投下的瞬间,将杀伤的处理分别交给杀伤范围内的部队或者建筑自己的方法处理。

思路:建立一个接口,让所有的部队或者建筑实现。

职责链模式(Chain of Responsibility)示例:

<?php

//被原子弹攻击的接口

interface NuclearAttacked {

    //处理被原子弹攻击的方法,参数为投放点的x和y坐标

  public function NuclearAttacked($x, $y);

}

//人族的基地,实现被原子弹攻击的接口,其他的内容暂时不考虑

class CommandCenter implements NuclearAttacked {

    //处理被原子弹攻击的方法,参数为投放点的x和y坐标

  public function NuclearAttacked($x, $y)

  {

    //根据离原子弹中心的距离,定义减少的血,如果超出了剩余的血,就炸掉

  }

}

//巡洋舰(俗称大和),实现被原子弹攻击的接口,其他的内容暂时不考虑

class Battlecruiser implements NuclearAttacked {

    //处理被原子弹攻击的方法,参数为投放点的x和y坐标

  public function NuclearAttacked($x, $y)

  {

    //根据离原子弹中心的距离,定义减少的血,如果超出了剩余的血,就炸掉

  }

}

//原子弹类

class Nuclear {

//被原子弹攻击的对象

public $attackedThings;

    //添加被原子弹攻击的对象

  public function addAttackedThings($thing)

  {

    //添加被原子弹攻击的对象

    $this->attackedThings[] = $thing;

  }

    //原子弹爆炸的方法,参数为投放点的x和y坐标

  public function blast($x, $y)

  {

      //把爆炸的事情交给所有涉及的对象,让他们自己处理

       foreach ($this->attackedThings as $thing)

       {

           //把爆炸的事情交给所有涉及的对象,让他们自己处理

          $thing->NuclearAttacked($x, $y);

       }

  }

}

 

//新建一个基地对象

$CommandCenter = new CommandCenter();

//新建一个巡洋舰对象

$Battlecruiser = new Battlecruiser();

//造了一颗原子弹

$Nuclear2 = new Nuclear();

//假设投放成功,那个瞬间一个基地对象和一个巡洋舰对象在杀伤范围内

$Nuclear2->addAttackedThings($CommandCenter);

$Nuclear2->addAttackedThings($Battlecruiser);

//原子弹爆炸,这样就把这个事件交给那些涉及的对象的处理方法,假设投放点的x和y坐标是2353, 368

$Nuclear2->blast(2353, 368);

?>

用途总结:职责链模式可以将一个涉及到多个对象的事件的处理交给对象自己处理,减少关联性。

实现总结:需要一个处理事件的接口,然后让所有的对象实现。

 


TAG: PHP 设计模式 面向对象 职责链模式

Lee's 引用 删除 fengguo60   /   2007-10-07 14:17:21
支持....

不过这个责任链的理解好像偏离了。说是观测者合适些。
引用 删除 神仙   /   2007-09-12 13:13:57
你这个是Observer模式啊……
lightsaber文锋--原创文章 引用 删除 lightsaber   /   2007-04-02 17:56:27
呵呵,谢谢夸奖,尽力而为吧。
cymple的个人空间 引用 删除 cymple   /   2007-04-02 14:30:35
兄弟,写得越来越好了
默默,PHP,MYSQL,LINUX,Javascript 引用 删除 默默   /   2007-04-02 13:15:08
呵呵,寓教于乐
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar