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字符转义相关函数小结(php下的转义字符串)
Apr 12 PHP
PHP 获取MySQL数据库里所有表的实现代码
Jul 13 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
May 15 PHP
PHP使用CURL_MULTI实现多线程采集的例子
Jul 29 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
PHP获取页面执行时间的方法(推荐)
Dec 10 PHP
php正则修正符用法实例详解
Dec 29 PHP
php7 安装yar 生成docker镜像
May 09 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 PHP
PHP观察者模式定义与用法实例分析
Mar 22 PHP
详解php命令注入攻击
Apr 06 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生成Flash动画的实现代码
2010/03/12 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
smarty中post用法实例
2014/11/28 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
Python3基础之基本数据类型概述
2014/08/13 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
django做form表单的数据验证过程详解
2019/07/26 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
音乐表演专业毕业生求职信
2013/10/14 职场文书
卫校毕业生自我鉴定
2013/10/31 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
让子弹飞观后感
2015/06/11 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript