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 相关文章推荐
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
解决php接收shell返回的结果中文乱码问题
Jan 23 PHP
php中require和require_once的区别说明
Feb 27 PHP
php格式化金额函数分享
Feb 02 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
Oct 08 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP Web表单生成器案例分析
Jun 02 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中在PDO中使用事务(Transaction)
2011/05/14 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
Request的中断和ErrorHandler实例解析
2018/02/12 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
大学生自我鉴定
2013/12/16 职场文书
黄河象教学反思
2014/02/10 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
2014年业务工作总结
2014/11/17 职场文书
2014年教育实习工作总结
2014/11/22 职场文书
环卫处个人工作总结
2015/03/04 职场文书
工程进度款催款函
2015/06/24 职场文书