php设计模式之职责链模式实例分析【星际争霸游戏案例】

本文实例讲述了php设计模式之职责链模式。分享给大家供大家参考,具体如下:

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

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

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

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

职责链模式(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);
?>

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

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

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • php设计模式之中介者模式分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之中介者模式.分享给大家供大家参考,具体如下: 星际的升级系统做得比较平衡,不过由于不少兵种和建筑的制造都需要有相关的科技建筑,所以关系比较复杂. 比如一个科学站造出来后,所有的飞机场都可以建造科技球了,但是一旦一个科学站被摧毁,就要看是否还有科学站,否则就得让所有的飞机场都不能造科技球. 我们可以用上次说的观察者模式解决问题,不过由于星际里面的升级相关比较多,似乎比较麻烦. 其实从实质来讲,任何升级一般只要知道某种建筑是否存在就行了,因此我们不必让他们多对多联系,设

  • php设计模式之原型模式分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之原型模式.分享给大家供大家参考,具体如下: 我们一般用new来新增对象,不过很多时候新增一个对象需要一些工作.而星际里面往往会新增某些类的大量的对象,比如新增很多机枪兵和龙骑. 待解决的问题:我们能否减少new的使用,同时避免需要新增对象的时候,了解对象的类名. 思路:php5提供了克隆方法,我们可以新增一个对象,然后每次需要新增和她同类的对象,克隆他就可以了. 原型(Prototype)模式示例: <?php //机枪兵类 class Marine { //所属的

  • php设计模式之正面模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之正面模式.分享给大家供大家参考,具体如下: 星际里面的战斗都是在地图上进行的,只要我们可以编辑地图,就可以创造一些新的战役.可是,星际里面的地图绘制相关的代码如果开放出来,估计大多数万家都看不懂,更不要说自己编辑地图了. 待解决的问题:在不了解地图代码的结构下,我们要让玩家自己编辑地图. 思路:对于玩家而言,他熟悉的是水晶矿,高地这些形状,他和系统通过鼠标交互.我们可以设计一个地图编辑器让玩家使用,而无需让他研究绘制地图的细节代码. (实际上暴雪公司就是这样做的,很

  • php设计模式之抽象工厂模式分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 星际争霸是战略游戏,所以同样的兵种,敌我显示是不同的. 典型的就是鼠标的颜色,点中自己的物体的时候,鼠标颜色变成绿色,点中敌人的物体的时候,鼠标颜色变成红色. 还有就是每个物体的状态,点中自己的物体的时候,状态区显示完整的状态,点中敌人的物体的时候,状态区显示一部分信息. 我们假设只考虑鼠标和人族的运输船,玩家自己的运输船点中后状态区会显示里面装载的部队,而点中敌人的则不会显示里面是否装载部队. 这样我们就有四种对象:

  • php设计模式之模板模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之模板模式.分享给大家供大家参考,具体如下: 星际中的虫族部队有个特别的进化兵种,就是飞龙,飞龙可以变成空中卫士(天蟹)或者吞噬者(对空的).另外还有口水兵可以进化变成地刺. 这三个变化过程都是类似的:变化的原部队消失,产生一个蛋或茧,孵化一会儿,蛋消失,新的部队产生. 如果我们把这三个进化独立开,就会产生重复的代码,冗余度增大了,所以我们要设法减少多余的代码. 待解决的问题:要经历同样的几个步骤,只是每个步骤的细节会有不同. 思路:做一个进化工程的框架,我们只要控制

  • php设计模式之状态模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之状态模式.分享给大家供大家参考,具体如下: 星际的一些兵种会有不止一种状态,比如坦克可以架起来,机枪兵可以打兴奋剂,甚至还有一些被动的,比如被虫族女王喷洒绿色液体后,敌人的行动变慢. 如果按照一般的思路,每次我们对一个小兵进行操作的时候,比如一辆坦克,我们都要用if判断他的状态,这样代码中会有很多的if,else或者swith. 不过我们可以发现,我们需要的是他在某个状态下的行为,如果把这些行为按照状态封装起来,就可以减少大量的判断. 待解决的问题:封装坦克的状态,

  • php设计模式之享元模式分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之享元模式.分享给大家供大家参考,具体如下: 星际的战斗达到后面,地图里面的部队很多,如果我们把每个兵的图像动画和属性值作为一个对象的话,系统的内存里会消耗极大. 我们在玩的时候会发现,因为星际里面的种族只有三个,其实兵种只有几十个. 虽然每个独立的士兵剩余的血不同,但是同一兵种的图像动画是一样的,即使不同的玩家,只是不同的颜色.比如每个人族的机枪兵. 而且大多数玩家只用到常用的一些兵种,很多时候不会制造所有的兵种. 待解决的问题:把把兵种的图像动画共享. 思路:我们

  • php设计模式之组合模式实例详解【星际争霸游戏案例】

    本文实例讲述了php设计模式之组合模式.分享给大家供大家参考,具体如下: 星际里面我们可以下载别人制作的地图,或者自己做地图玩. 我们在选择玩哪张地图的时候,可以看到游戏列出当前地图包里面的地图或地图包的名字. 虽然地图和地图包是通过文件和文件夹区分的,但是我们开发的时候,总希望能使用对象来进行抽象. 那么对于地图和地图包这两个相关的对象,我们能不能简化他们之间的区别呢? 待解决的问题:尽量是调用这两种对象的代码一致,也就是说很多场合不必区分到底是地图还是地图包. 思路:我们做一个抽象类,让地图

  • php设计模式之备忘模式分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之备忘模式.分享给大家供大家参考,具体如下: 我们在玩星际任务版或者单机与电脑对战的时候,有时候会突然要离开游戏,或者在出兵前面,需要存储一下游戏. 那么我们通过什么办法来保存目前的信息呢?而且在任何时候,可以恢复保存的游戏呢? 待解决的问题:保存游戏的一切信息,如果恢复的时候完全还原. 思路:建立一个专门保存信息的类,让他来处理这些事情,就像一本备忘录. 为了简单,我们这里用恢复一个玩家的信息来演示. 备忘(Memento)模式示例: <?php //备忘类 cla

  • php设计模式之建造器模式分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之建造器模式.分享给大家供大家参考,具体如下: 星际里面有不少的任务关,也可以自己编辑地图,画面上有各种地形,建筑和部队. 这存在一个问题,初始化画面的流程很乱. 待解决的问题:完成初始化画面的工作,同时尽量减少各种绘制细节的耦合. 思路:既然星际的画面由几个部分组成:地图(就是地形和矿产),建筑,部队.那么我们把他们看成是零件,组装起来就是最后的产品(整个画面). 建造器(Builder)模式示例: <?php //规范制造各个零件的接口 interface Bui

  • php设计模式之策略模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之策略模式.分享给大家供大家参考,具体如下: 星际开地图对战,等5秒钟进入地图后,每个玩家都会拥有一个基地,几个农民等,还会有初始的人口供给.但这些是根据种族的不同而不同. 待解决的问题:我们需要根据种族的不同,而对玩家进行不同的初始化,最好将这些不同的处理方式封装. 思路:定义初始化的接口,然后制作不同种族的初始化类. 策略模式(Strategy)示例: 为了使代码不至于过长,一部分类的定义不在此写出,如果要调试,请用字符串等方式替代new. <?php //玩家的

  • php设计模式之代理模式分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之代理模式.分享给大家供大家参考,具体如下: 星际争霸如果是多人对战模式,就会遇到一个问题:如何降低网络延时和负担. 为了确保数据的一致性,我们应该将每个玩家的发生变化的数据不停的传送到开地图的主机进行保存,一旦任何某个玩家的客户机读取数据,就必须向主机请求数据. 尽管大多数数据是交互性的,即使某个玩家的人口也是这样的,如果某个敌人的部队杀死了这个玩家的一个部队,立即影响了他的人口数量. 不过水晶矿和气矿有所不同,除了玩家自己的建造操作和农民采集,别的玩家影响不了这个

随机推荐