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的urlencode()URL编码函数浅析
Aug 09 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
浅析memcache启动以及telnet命令详解
Jun 28 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
PHP中比较时间大小实例
Aug 21 PHP
php输出xml必须header的解决方法
Oct 17 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
如何使用微信公众平台开发模式实现多客服
Jan 06 PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 PHP
PHP PDO操作MySQL基础教程
Jun 05 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
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
Open and Print a Word Document
2007/06/15 Javascript
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
python实现获取Ip归属地等信息
2016/08/27 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
python实现电子产品商店
2019/02/26 Python
python3转换code128条形码的方法
2019/04/17 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
UNIX文件系统分类
2014/11/11 面试题
家长给老师的道歉信
2014/01/13 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
基层工作经验证明样本
2014/11/16 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript