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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
将数字格式的计算结果转为汉字格式
Oct 09 PHP
dedecms中常见问题修改方法总结
Mar 21 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
php 各种应用乱码问题的解决方法
May 09 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 PHP
php写app用的框架整理
Sep 29 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访问查询mysql数据的三种方法
2006/10/09 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
JS event使用方法详解
2008/04/28 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
详解tween.js 中文使用指南
2018/01/05 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
用Python制作简单的钢琴程序的教程
2015/04/01 Python
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python创建xml文件示例
2017/03/22 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
详解python3中的真值测试
2018/08/13 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
在校生自我鉴定
2014/01/23 职场文书
《画家乡》教学反思
2014/04/22 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
我爱我班主题班会
2015/08/13 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python