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程序
Oct 09 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
Laravel获取所有的数据库表及结构的方法
Oct 10 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 PHP
PHP autoload使用方法及步骤详解
Sep 05 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中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
php curl发送请求实例方法
2019/08/01 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
浅谈javascript中遇到的字符串对象处理
2016/11/18 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
基于Python的身份证号码自动生成程序
2014/08/15 Python
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
python实现反转部分单向链表
2018/09/27 Python
python实现自动化上线脚本的示例
2019/07/01 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
社区党建工作汇报材料
2014/08/14 职场文书
歌咏比赛主持词
2015/06/29 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
python游戏开发Pygame框架
2022/04/22 Python
在 Python 中利用 Pool 进行多线程
2022/04/24 Python