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 相关文章推荐
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
PHP连接Access数据库的方法小结
Jun 20 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
laravel 执行迁移回滚示例
Oct 23 PHP
PHP Swoole异步Redis客户端实现方法示例
Oct 24 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
自动跳转中英文页面
2006/10/09 PHP
用PHP读取RSS feed的代码
2008/08/01 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
vue 登录滑动验证实现代码
2018/08/24 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
Python中取整的几种方法小结
2017/01/06 Python
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
Python登录系统界面实现详解
2019/06/25 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
后备干部考察材料
2014/02/12 职场文书
教师考察材料范文
2014/06/03 职场文书
2014年底个人工作总结
2015/03/10 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
重阳节简报
2015/07/20 职场文书
PO模式在selenium自动化测试框架的优势
2022/03/20 Python
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python