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去除字符串换行符示例分享
Feb 13 PHP
ThinkPHP查询中的魔术方法简述
Jun 25 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
JavaScript实现滚动栏效果的方法
Apr 27 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
PHP数组常用函数实例小结
Aug 20 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
laravel 解决Validator使用中出现的问题
Oct 25 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数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
vue鼠标悬停事件实例详解
2019/04/01 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
python实现简单登陆流程的方法
2018/04/22 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
python内打印变量之%和f的实例
2020/02/19 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
工程款催款函
2015/06/24 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
2022漫威和DC电影上映作品
2022/04/05 欧美动漫
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技