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 相关文章推荐
40个迹象表明你还是PHP菜鸟
Sep 29 PHP
php smarty模版引擎中的缓存应用
Dec 11 PHP
利用php+mysql来做一个功能强大的在线计算器
Oct 12 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
PHP 9 大缓存技术总结
Sep 17 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
CI框架数据库查询缓存优化的方法
Nov 21 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
PHP一个简单的无需刷新爬虫
Jan 05 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 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中生成随机密码的自定义函数代码
2013/10/21 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
python获取时间及时间格式转换问题实例代码详解
2018/12/06 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
学期自我评价
2014/01/27 职场文书
学习经验交流会主持词
2014/04/01 职场文书
辞职信范文大全
2015/03/02 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏