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 应用程序安全防范技术研究
Sep 25 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
May 18 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
Jul 03 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
php单例模式示例分享
Feb 12 PHP
微信公众号开发之文本消息自动回复php代码
Aug 08 PHP
PHP中explode函数和split函数的区别小结
Aug 24 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
Mar 16 PHP
PHP中检查isset()和!empty()函数的必要性
Feb 13 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源码之explode使用说明
2011/08/05 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
PHP类的特性实例分析
2016/09/28 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
js中的面向对象入门
2017/03/06 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
python基础教程之字典操作详解
2014/03/25 Python
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
GoPro摄像机美国官网:美国运动相机厂商
2018/07/03 全球购物
妇科医生自荐信
2013/11/05 职场文书
消防先进事迹材料
2014/02/10 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
一岗双责责任书
2014/04/15 职场文书
关于学习的演讲稿
2014/05/10 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
详解Node.js如何处理ES6模块
2021/05/15 Javascript