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 Session变量不能传送到下一页的解决方法
Nov 27 PHP
php学习之运算符相关概念
Jun 09 PHP
php 启动报错如何解决
Jan 17 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
php统计数组元素个数的方法
Jul 02 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
php提取微信账单的有效信息
Oct 01 PHP
php常用的工具开发整理
Sep 26 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 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
使用php4加速网络传输
2006/10/09 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
php中namespace use用法实例分析
2016/01/22 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
python 的topk算法实例
2020/04/02 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
新学期红领巾广播稿
2014/01/14 职场文书
大学生自我鉴定范文模板
2014/01/21 职场文书
大学毕业自我评价
2014/02/02 职场文书
开门红主持词
2014/04/02 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
安全教育的主题班会
2015/08/13 职场文书
七年级英语教学反思
2016/02/15 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python