php设计模式之状态模式实例分析【星际争霸游戏案例】


Posted in PHP onMarch 26, 2020

本文实例讲述了php设计模式之状态模式。分享给大家供大家参考,具体如下:

星际的一些兵种会有不止一种状态,比如坦克可以架起来,机枪兵可以打兴奋剂,甚至还有一些被动的,比如被虫族女王喷洒绿色液体后,敌人的行动变慢。

如果按照一般的思路,每次我们对一个小兵进行操作的时候,比如一辆坦克,我们都要用if判断他的状态,这样代码中会有很多的if,else或者swith。

不过我们可以发现,我们需要的是他在某个状态下的行为,如果把这些行为按照状态封装起来,就可以减少大量的判断。

待解决的问题:封装坦克的状态,让状态自己去控制行为。

思路:把状态作为属性,兵种类本身只控制状态的变化,具体的行为由状态类定义。

状态(State)模式示例:

<?php
  //坦克状态的接口
  interface TankState
  {
    //坦克的攻击方法
    public function attack();
  }

  //坦克普通状态
  class TankState_Tank implements TankState
  {
    //坦克的攻击方法
    public function attack()
    {
      //这里简单的输出当前状态
      echo "普通状态";
    }
  }

  //坦克架起来的状态
  class TankState_Siege implements TankState
  {
    //坦克的攻击方法
    public function attack()
    {
      //这里简单的输出当前状态
      echo "架起来了";
    }
  }

  //坦克类
  class Tank
  {
    //状态
    public $state;

    //坦克的攻击方法
    public function __construct()
    {
      //新造出来的坦克当然是普通状态
      $this->state = new TankState_Tank();
    }

    //设置状态的方法,假设参数为玩家点击的键盘
    public function setState($key)
    {
      //如果按了s
      if($key = 's')
      {
        $this->state = new TankState_Siege();
      }
      //如果按了t
      elseif($key = 't')
      {
        $this->state = new TankState_Tank();
      }
    }

    //坦克的攻击方法
    public function attack()
    {
      //由当前状态自己来处理攻击
      $this->state->attack();
    }
  }

  //新造一辆坦克
  $tank = new Tank();

  //假设正好有个敌人路过,坦克就以普通模式攻击了
  $tank->attack();

  //架起坦克
  $tank->setState('s');

  //坦克再次攻击,这次是架起模式
  $tank->attack();
?>

用途总结:状态模式可以将和状态相关的行为和属性封装,除了切换状态时,其它地方就不需要大量的判断当前状态,只要调用当前状态的方法等。

实现总结:用一个接口规范状态类需要实现的方法,比如上面的TankState规定了attack()。把各个状态封装成类,将不同状态下的不同方法放入各自的状态类,比如上面的攻击方法,同时所有的状态执行接口。原来的事务类,比如上面的Tank类,只负责状态切换,一旦需要某一个方法的调用,只要交给当前状态就可以了。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
40个迹象表明你还是PHP菜鸟
Sep 29 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
Jul 01 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
PHP中文编码小技巧
Dec 25 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
Oct 09 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 PHP
简单谈谈PHP中的Reload操作
Dec 12 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 PHP
PHP获取当前系统时间的方法小结
Oct 03 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 #PHP
You might like
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
JS正则表达式验证数字代码
2014/01/28 Javascript
js单词形式的运算符
2014/05/06 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
const和static readonly区别
2013/05/20 面试题
大学生求职自荐信
2013/12/12 职场文书
军校本科大学生自我评价
2014/01/14 职场文书
市场营销毕业求职信
2014/08/07 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
演讲开场白台词大全
2015/05/29 职场文书
三国演义读书笔记
2015/06/25 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL