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+AJAX聊天程序[聊天室]提供下载
Jul 21 PHP
discuz7 phpMysql操作类
Jun 21 PHP
一贴学会PHP 新手入门教程
Aug 03 PHP
PHP 小心urldecode引发的SQL注入漏洞
Oct 27 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
Nov 03 PHP
打造超酷的PHP数据饼图效果实现代码
Nov 23 PHP
PHP获取当前url的具体方法全面解析
Nov 26 PHP
php中return的用法实例分析
Feb 28 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
php file_get_contents取文件中数组元素的方法
Apr 01 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 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
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
分析python服务器拒绝服务攻击代码
2014/01/16 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
python实现自动发送邮件
2018/06/20 Python
python得到单词模式的示例
2018/10/15 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
python交互模式基础知识点学习
2020/06/18 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
keras K.function获取某层的输出操作
2020/06/29 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
西安交大自主招生自荐信
2014/01/27 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
绿色环保演讲稿
2014/05/10 职场文书
企业党建工作总结2015
2015/05/26 职场文书
教师节老师寄语
2015/05/28 职场文书
离婚财产分割协议书
2015/08/11 职场文书