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+Tidy-完美的XHTML纠错+过滤
Apr 10 PHP
56.com视频采集接口程序(PHP)
Sep 22 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
小文件php+SQLite存储方案
Sep 04 PHP
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
5种PHP创建数组的实例代码分享
Jan 17 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
php函数传值的引用传递注意事项分析
Jun 25 PHP
php微信公众账号开发之前五个坑(一)
Sep 18 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 #PHP
You might like
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
js indexOf()定义和用法
2012/10/21 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
js表单验证实例讲解
2016/03/31 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
Python中pygal绘制雷达图代码分享
2017/12/07 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
python 显示数组全部元素的方法
2018/04/19 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
小学生期末评语
2014/04/21 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
入党现实表现材料
2014/12/23 职场文书
centos7安装mysql5.7经验记录
2022/05/02 Servers