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中调用JAVA
Oct 09 PHP
高亮度显示php源代码
Oct 09 PHP
在Windows版的PHP中使用ADO
Oct 09 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
Sep 24 PHP
Mysql和网页显示乱码解决方法集锦
Mar 27 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
Oct 22 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
如何使用GDB调试PHP程序
Dec 08 PHP
php中通用的excel导出方法实例
Dec 30 PHP
PHP调用微博接口实现微博登录的方法示例
Sep 22 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读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
JavaScript 序列化对象实现代码
2009/12/18 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
再谈JavaScript线程
2015/07/10 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
Angular实现form自动布局
2016/01/28 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
使用Python操作MySQL的一些基本方法
2015/08/16 Python
python操作 hbase 数据的方法
2016/12/18 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
Python Process多进程实现过程
2019/10/22 Python
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
Linux的文件类型
2012/03/07 面试题
涉外文秘个人求职的自我评价
2013/10/07 职场文书
精细化工应届生求职信
2013/11/17 职场文书
校园自助餐厅的创业计划书
2013/12/26 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
责任书格式
2019/04/18 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
windows系统搭建WEB服务器详细教程
2022/08/05 Servers