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 相关文章推荐
dedecms防止FCK乱格式化你的代码的修改方法
Mar 17 PHP
php相当简单的分页类
Oct 02 PHP
PHP Array交叉表实现代码
Aug 05 PHP
php中取得URL的根域名的代码
Mar 23 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
PHP自定session保存路径及删除、注销与写入的方法
Nov 18 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 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 URL跳转代码 减少外链
2011/06/25 PHP
第六章 php目录与文件操作
2011/12/30 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
php实现无限级分类
2014/12/24 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
javascript 获取网页参数系统
2008/07/19 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
JS实现放烟花效果
2020/03/10 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
django批量导入xml数据
2016/10/16 Python
python实现聊天小程序
2018/03/13 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
详解python3中tkinter知识点
2018/06/21 Python
Python中存取文件的4种不同操作
2018/07/02 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
利用python求积分的实例
2019/07/03 Python
python 多线程中join()的作用
2020/10/29 Python
护理工作感言
2014/01/16 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
2015上半年个人工作总结
2015/07/27 职场文书