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 相关文章推荐
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
php网页后退不再出现过期
Mar 08 PHP
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
php中fsockopen用法实例
Jan 05 PHP
Smarty最简单实现列表奇偶变色的方法
Jul 01 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
smarty高级特性之对象的使用方法
Dec 25 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
Feb 25 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使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
2019/05/06 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
初步剖析C语言编程中的结构体
2016/01/16 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
python先序遍历二叉树问题
2017/11/10 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Python测试线程应用程序过程解析
2019/12/31 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
大学生简历中个人的自我评价
2013/10/06 职场文书
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
会计实习自我鉴定
2013/12/04 职场文书
好的演讲稿开场白
2013/12/30 职场文书
中学教师自我鉴定
2014/02/07 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android