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 相关文章推荐
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
Mar 21 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
ThinkPHP中的关联模型注意点
Jun 16 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
浅谈php提交form表单
Jul 01 PHP
php开发微信支付获取用户地址
Oct 04 PHP
PHP中list()函数用法实例简析
Jan 08 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 #PHP
You might like
PHP+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
PHP文件操作详解
2016/12/30 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
python实现二维插值的三维显示
2018/12/17 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
python 获取等间隔的数组实例
2019/07/04 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
Python自动创建Excel并获取内容
2020/09/16 Python
英国儿童图书网站:Scholastic
2017/03/26 全球购物
工作个人的自我评价
2014/01/14 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书