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 相关文章推荐
数据库查询记录php 多行多列显示
Aug 15 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
php随机显示图片的简单示例
Feb 15 PHP
Linux下手动编译安装PHP扩展的例子分享
Jul 15 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
PHP设计模式之简单投诉页面实例
Feb 24 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
CodeIgniter整合Smarty的方法详解
Aug 25 PHP
php和redis实现秒杀活动的流程
Jul 17 PHP
laravel 解决paginate查询多个字段报错的问题
Oct 22 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实现无限分类的实现方法
2016/11/14 PHP
Dom在ajax技术中的作用说明
2010/10/25 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
如何基于python实现脚本加密
2019/12/28 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
python中return如何写
2020/06/18 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
英语专业推荐信
2013/11/16 职场文书
大班幼儿评语大全
2014/04/30 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
入党自荐书范文
2015/03/05 职场文书
经理岗位职责范本
2015/04/15 职场文书
企业催款函范本
2015/06/24 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
导游词之江南周庄
2019/12/06 职场文书