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 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
一个比较简单的PHP 分页分组类
Dec 10 PHP
php处理文件的小例子(解压缩,删除目录)
Feb 03 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP魔术引号所带来的安全问题分析
Jul 15 PHP
Windows7下的php环境配置教程
Feb 28 PHP
php使用Imagick生成图片的方法
Jul 31 PHP
smarty简单应用实例
Nov 03 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
微信支付开发告警通知实例
Jul 12 PHP
thinkPHP商城公告功能开发问题分析
Dec 01 PHP
Yii2实现中国省市区三级联动实例
Feb 08 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
jQuery 选择器理解
2010/03/16 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
JSONP之我见
2015/03/24 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python 设置文件编码格式的实现方法
2017/12/21 Python
Django项目中包含多个应用时对url的配置方法
2018/05/30 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
应届生新闻编辑求职信
2013/11/19 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
Redis 限流器
2022/05/15 Redis