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 相关文章推荐
?生?D片??C字串
Dec 06 PHP
PHP获取网卡地址的代码
Apr 09 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
Server.HTMLEncode让代码在页面里显示为源代码
Dec 08 PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
php超快高效率统计大文件行数
Jul 05 PHP
ThinkPHP控制器详解
Jul 27 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
Sep 23 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
php往mysql中批量插入数据实例教程
Dec 12 PHP
Laravel框架创建路由的方法详解
Sep 04 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实现ping
2006/10/09 PHP
PHP中输出转义JavaScript代码的实现代码
2011/04/22 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
php把数组值转换成键的方法
2015/07/13 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
python实现桌面气泡提示功能
2019/07/29 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
旷课检讨书1000字
2014/02/14 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
《颐和园》教学反思
2014/02/26 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技