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


Posted in PHP onMarch 27, 2020

本文实例讲述了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 相关文章推荐
使用sockets:从新闻组中获取文章(二)
Oct 09 PHP
PHP编程之高级技巧——利用Mysql函数
Oct 09 PHP
php 获得汉字拼音首字母的函数
Aug 01 PHP
PHP无敌近乎加密方式!
Jul 17 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
那些年我们错过的魔术方法(Magic Methods)
Jan 14 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
Jun 09 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 PHP
php+mysql开发中的经验与常识小结
Mar 25 PHP
laravel实现前后台路由分离的方法
Oct 13 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 #PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 #PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 #PHP
Centos7安装swoole扩展操作示例
Mar 26 #PHP
PHP开发api接口安全验证操作实例详解
Mar 26 #PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 #PHP
php中加密解密DES类的简单使用方法示例
Mar 26 #PHP
You might like
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
老生常谈PHP中的数据结构:DS扩展
2017/07/17 PHP
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
python解析yaml文件过程详解
2019/08/30 Python
python中数据库like模糊查询方式
2020/03/02 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
如何撰写岗位职责
2014/02/01 职场文书
大学毕业自我评价
2014/02/02 职场文书
优秀实习生感言
2014/03/01 职场文书
党员个人公开承诺书
2014/08/29 职场文书
高中运动会广播稿
2014/09/16 职场文书
安全保证书格式
2015/02/28 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
Nginx配置根据url参数重定向
2022/04/11 Servers