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 相关文章推荐
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
Aug 26 PHP
php生成缩略图的类代码
Oct 02 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
May 07 PHP
php小经验:解析preg_match与preg_match_all 函数
Jun 29 PHP
PHP5.5在windows安装使用memcached服务端的方法
Apr 16 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
PHP遍历目录文件的常用方法小结
Feb 03 PHP
php利用imagemagick实现复古老照片效果实例
Feb 16 PHP
PHP实现小程序批量通知推送
Nov 27 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
CURL状态码列表(详细)
2013/06/27 PHP
使用PHP编写的SVN类
2013/07/18 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
js定时器实例分享
2016/12/20 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
python3序列化与反序列化用法实例
2015/05/26 Python
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
python进行文件对比的方法
2018/12/24 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
python getopt模块使用实例解析
2019/12/18 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
个人简历中的自我评价范例
2013/10/29 职场文书
办公室驾驶员岗位职责
2013/11/15 职场文书
英语商务邀请函范文
2014/01/16 职场文书
社区中秋节活动方案
2014/01/29 职场文书
租房协议书
2014/09/12 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
大学运动会加油稿
2015/07/22 职场文书
python OpenCV学习笔记
2021/03/31 Python
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技