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 无限级 SelectTree 类
May 19 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
深入理解php printf() 输出格式化的字符串
May 23 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 PHP
静态html文件执行php语句的方法(推荐)
Nov 21 PHP
PHP获取页面执行时间的方法(推荐)
Dec 10 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
php求斐波那契数的两种实现方式【递归与递推】
Sep 09 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
Symfony2之session与cookie用法小结
2016/03/18 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
表单提交验证类
2006/07/14 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
JavaScript代码实现简单计算器
2020/12/27 Javascript
Python将json文件写入ES数据库的方法
2019/04/10 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
委托培训协议书
2014/11/17 职场文书
保研专家推荐信范文
2015/03/25 职场文书
学校会议通知范文
2015/04/15 职场文书
安全教育片观后感
2015/06/17 职场文书
导游词之无锡梅园
2019/11/28 职场文书
导游词之任弼时故居
2020/01/07 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python