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模拟HTTP认证
Oct 09 PHP
adodb与adodb_lite之比较
Dec 31 PHP
实用函数8
Nov 08 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
Jul 03 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
ucenter通信原理分析
Jan 09 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
php获取是星期几的的一些常用姿势
Dec 15 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网站判断用户是否是手机访问的方法
2013/11/01 PHP
19个超实用的PHP代码片段
2014/03/14 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
PHP多文件上传实例
2015/07/09 PHP
php文件缓存方法总结
2016/03/16 PHP
jQuery Selector选择器小结
2010/05/06 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
以一段代码为实例快速入门Python2.7
2015/03/31 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python实现简单遗传算法(SGA)
2018/01/29 Python
Django添加sitemap的方法示例
2018/08/06 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
python中关于数据类型的学习笔记
2020/07/19 Python
利用Python优雅的登录校园网
2020/10/21 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
中海讯通笔试题
2015/09/15 面试题
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android