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

 更新时间:2020年03月26日 08:30:42   作者:DavidHHuan  
这篇文章主要介绍了php设计模式之状态模式,结合星际争霸游戏案例形式分析了php状态模式相关原理、使用技巧与注意事项,需要的朋友可以参考下

本文实例讲述了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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

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

相关文章

  • php unlink()函数使用教程

    php unlink()函数使用教程

    最近在写个网站,需要上传图片,如果修改图片,就图片就没有用了,会占用服务器的硬盘资源,所以想到用unlink函数删除旧照片.下面脚本之家小编给大家带来了php unlink()函数使用教程,感兴趣的朋友一起看看吧
    2018-07-07
  • ECSHOP在PHP5.5及高版本上报错的解决方法

    ECSHOP在PHP5.5及高版本上报错的解决方法

    程序不断的更新换代,php版本也在不断的推陈出新,自从php7.0推出,php5.5版本已落伍,但是目前使用php5.5的也不少,接下来,小编给大家整理关于ECSHOP在PHP5.5及高版本上报错的解决方法,小伙伴们一起来学习吧
    2015-08-08
  • 深入HTTP响应状态码速查表的详解

    深入HTTP响应状态码速查表的详解

    本篇文章是对HTTP响应状态码速查表进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Laravel5.1 框架模型一对一关系实现与使用方法实例分析

    Laravel5.1 框架模型一对一关系实现与使用方法实例分析

    这篇文章主要介绍了Laravel5.1 框架模型一对一关系实现与使用方法,结合实例形式分析了laravel5.1框架模型一对一关系的原理、定义与使用方法,需要的朋友可以参考下
    2020-01-01
  • thinkphp中的url跳转用法分析

    thinkphp中的url跳转用法分析

    这篇文章主要介绍了thinkphp中的url跳转用法,结合实例形式对比分析了几种常用的URL跳转技巧,需要的朋友可以参考下
    2016-07-07
  • PHP实现生成唯一编号(36进制的不重复编号)

    PHP实现生成唯一编号(36进制的不重复编号)

    这篇文章主要介绍了PHP实现生成唯一编号,文中使用10进制转换36进制得到不重复的6000多万个唯一编号,编号位数为10位,需要的朋友可以参考下
    2014-07-07
  • Thinkphp5.0 框架Model模型简单用法分析

    Thinkphp5.0 框架Model模型简单用法分析

    这篇文章主要介绍了Thinkphp5.0 框架Model模型简单用法,结合实例形式分析了thinkPHP5.0框架模型Model常用方法的简单使用技巧,需要的朋友可以参考下
    2019-10-10
  • CI映射(加载)数据到view层的方法

    CI映射(加载)数据到view层的方法

    这篇文章主要介绍了CI映射(加载)数据到view层的方法,结合实例形式分析了CI映射加载数据到view层的原理与正确使用方法,需要的朋友可以参考下
    2016-03-03
  • php使用json_encode对变量json编码

    php使用json_encode对变量json编码

    这篇文章主要是说明 json_encode 使用时一个需要注意的细节,无论返回的是数组还是 json,都不代表这一定就是个错误的返回结果,当前端需要的数组时,数组就是正确的结果,反之亦然
    2014-04-04
  • php图片裁剪函数

    php图片裁剪函数

    这篇文章主要为大家详细介绍了php图片裁剪函数,图片裁剪工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10

最新评论