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 相关文章推荐
php实现mysql数据库备份类
Mar 20 PHP
php 方便水印和缩略图的图形类
May 21 PHP
php google或baidu分页代码
Nov 26 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
php设计模式 Visitor 访问者模式
Jun 28 PHP
php创建基本身份认证站点的方法详解
Jun 08 PHP
php使用mkdir创建多级目录入门例子
May 10 PHP
async和DOM Script文件加载比较
Jul 20 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 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
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
Laravel实现表单提交
2017/05/07 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
python计算一个序列的平均值的方法
2015/07/11 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python实现简单flappy bird
2018/12/24 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
探亲假请假条
2014/04/11 职场文书
学习退步检讨书
2014/09/28 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
JavaScript函数柯里化
2021/11/07 Javascript