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的面向对象编程
Oct 09 PHP
用PHP读取RSS feed的代码
Aug 01 PHP
php数组的概述及分类与声明代码演示
Feb 26 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
你可能不知道PHP get_meta_tags()函数
May 12 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
PHP实现的增强性mhash函数
May 27 PHP
PHP封装的MSSql操作类完整实例
May 26 PHP
Yii框架数据模型的验证规则rules()被执行的方法
Dec 02 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
Apr 18 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
星际中的相关伤害
2020/03/04 星际争霸
一些常用的php函数
2006/12/06 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
php分页函数示例代码分享
2014/02/24 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
php中如何执行linux命令详解
2018/11/06 PHP
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
Python入门篇之面向对象
2014/10/20 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Pygame框架实现飞机大战
2020/08/07 Python
python 写一个文件分发小程序
2020/12/05 Python
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
交通安全标语
2014/06/06 职场文书
2014教师研修学习体会
2014/07/08 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
测量员岗位职责
2015/02/14 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
婚育证明样本
2015/06/16 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
战友聚会致辞
2015/07/28 职场文书