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 相关文章推荐
很实用的一个完整email发送程序
Oct 09 PHP
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
php mssql 数据库分页SQL语句
Dec 16 PHP
163的邮件用phpmailer发送(实例详解)
Jun 24 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
apache中为php 设置虚拟目录
Dec 17 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
Laravel实现ApiToken认证请求
Oct 14 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 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函数
2006/10/09 PHP
php将数据库导出成excel的方法
2010/05/07 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
php计算年龄精准到年月日
2015/11/17 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
深入讲解Java编程中类的生命周期
2016/02/05 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
python将音频进行变速的操作方法
2020/04/08 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
考博自荐信
2013/10/25 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
校本研修个人总结
2015/02/28 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
使用HttpSessionListener监听器实战
2022/03/17 Java/Android