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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
php中文本数据翻页(留言本翻页)
Oct 09 PHP
php header()函数使用说明
Jul 10 PHP
PHP CKEditor 上传图片实现代码
Nov 06 PHP
ThinkPHP CURD方法之where方法详解
Jun 18 PHP
PHP获取当前页面URL函数实例
Oct 22 PHP
php去除二维数组的重复项方法
Nov 03 PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
YII2 实现多语言配置的方法分享
Jan 11 PHP
PHP chr()函数讲解
Feb 11 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 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+DBM的同学录程序(4)
2006/10/09 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
PHP类的特性实例分析
2016/09/28 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
使用jquery实现放大镜效果
2014/09/02 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
python3图片转换二进制存入mysql
2013/12/06 Python
python连接mysql实例分享
2016/10/09 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
pytorch构建多模型实例
2020/01/15 Python
jupyter notebook实现显示行号
2020/04/13 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
编辑硕士自荐信范文
2013/11/27 职场文书
会计求职信范文
2014/05/24 职场文书
2014中考励志标语
2014/06/05 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
Python制作表白爱心合集
2022/01/22 Python