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 多个submit提交表单 处理方法
Jul 07 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
PHP __autoload()方法真的影响性能吗?
Mar 30 PHP
使用PHP下载CSS文件中的图片的代码
Sep 24 PHP
一个非常完美的读写ini格式的PHP配置类分享
Feb 12 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
php实现的http请求封装示例
Nov 08 PHP
PHP命令空间namespace及use的用法小结
Nov 27 PHP
php实现的表单验证类完整示例
Aug 13 PHP
php正则表达式使用方法整理集合
Jan 31 PHP
php + ajax 实现的写入数据库操作简单示例
May 16 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+ajax实时刷新简单实例
2015/02/25 PHP
浅谈json_encode用法
2015/03/05 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
python3.3实现乘法表示例
2014/02/07 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python学生信息管理系统
2018/03/13 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
python获取txt文件词向量过程详解
2019/07/05 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
C语言笔试题
2014/09/04 面试题
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
报社实习生自荐信
2014/01/24 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
南京大屠杀观后感
2015/06/02 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书