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 相关文章推荐
文章推荐系统(三)
Oct 09 PHP
windows下PHP APACHE MYSQ完整配置
Jan 02 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
PHP常用编译参数中文说明
Sep 27 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
PHP+Ajax验证码验证用户登录
Jul 20 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
Aug 01 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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调用三种数据库的方法(2)
2006/10/09 PHP
注册页面之前先验证用户名是否存在的php代码
2012/07/14 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
用javascript实现自定义标签
2007/05/08 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
python2与python3的print及字符串格式化小结
2018/11/30 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
Python map及filter函数使用方法解析
2020/08/06 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
Python __slots__的使用方法
2020/11/15 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
财务管理专业应届毕业生求职信
2013/09/22 职场文书
毕业生找工作的自我评价
2013/10/18 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
教师节领导致辞
2015/07/29 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
「魔法少女伊莉雅」美游粘土人开订
2022/03/21 日漫