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 获取mysql数据库信息代码
Mar 12 PHP
PHP缓存技术的多种方法小结
Aug 14 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
May 05 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 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
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
对联广告js flash激活
2006/10/19 Javascript
JavaScript中的排序算法代码
2011/02/22 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
js中作用域的实例解析
2017/03/16 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
Python探索之修改Python搜索路径
2017/10/25 Python
python实现求最长回文子串长度
2018/01/22 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
一年级班主任工作总结2014
2014/11/08 职场文书
新娘婚礼致辞
2015/07/27 职场文书
学习党史心得体会2016
2016/01/23 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫