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 相关文章推荐
杏林同学录(八)
Oct 09 PHP
PHP 5.3.0 安装分析心得
Aug 07 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
PHP数据过滤的方法
Oct 30 PHP
PHP中__autoload和Smarty冲突的简单解决方法
Apr 08 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
php利用递归实现删除文件目录的方法
Sep 23 PHP
php结合ajax实现手机发红包的案例
Oct 13 PHP
php接口技术实例详解
Dec 07 PHP
Yii2 加载css、js 载静态资源的方法
Mar 10 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 04 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
Zend公司全球首推PHP认证
2006/10/09 PHP
php合并js请求的例子
2013/11/01 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
JavaScript实现区块链
2018/03/14 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
python备份文件的脚本
2008/08/11 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
python中的协程深入理解
2019/06/10 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
python类的实例化问题解决
2019/08/31 Python
python绘制随机网络图形示例
2019/11/21 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
大专自我鉴定范文
2013/10/23 职场文书
大学自荐信
2013/12/12 职场文书
中班教师个人总结
2015/02/05 职场文书
工作收入证明范本
2015/06/12 职场文书
病房管理制度范本
2015/08/06 职场文书
八年级作文之我的母亲
2019/12/10 职场文书