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 不同编码下的字符串长度区分
Sep 26 PHP
解析PHP提交后跳转
Jun 23 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
php生成二维码时出现中文乱码的解决方法
Dec 18 PHP
php实现俄罗斯乘法实例
Mar 07 PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 PHP
php登录超时检测功能实例详解
Mar 21 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
laravel 中某一字段自增、自减的例子
Oct 11 PHP
Laravel 创建可以传递参数 Console服务的例子
Oct 14 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
php socket方式提交的post详解
2008/07/19 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
2010/02/09 PHP
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
2014/09/01 Javascript
js实现表格筛选功能
2017/01/18 Javascript
微信小程序之picker日期和时间选择器
2017/02/09 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
go和python调用其它程序并得到程序输出
2014/02/10 Python
图文详解WinPE下安装Python
2016/05/17 Python
Python中is和==的区别详解
2018/11/15 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
谈谈Python中的while循环语句
2019/03/10 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
英国手机零售商:Metrofone
2019/03/18 全球购物
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书