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 相关文章推荐
模仿OSO的论坛(四)
Oct 09 PHP
php不用正则采集速度探究总结
Mar 24 PHP
PHP 获取MySQL数据库里所有表的实现代码
Jul 13 PHP
Apache服务器无法使用的解决方法
May 08 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
php中的比较运算符详解
Oct 28 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
Feb 04 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP实现生成数据字典功能示例
May 24 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学习教程之第1天
2008/06/15 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
设定php简写功能的方法
2019/11/28 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
javascript时间差插件分享
2016/07/18 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
Python中functools模块的常用函数解析
2016/06/30 Python
pandas多级分组实现排序的方法
2018/04/20 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
国贸专业个人求职信分享
2013/12/04 职场文书
不假外出检讨书
2014/01/27 职场文书
初一体育教学反思
2014/01/29 职场文书
初二物理教学反思
2014/01/29 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
见习报告格式要求
2014/11/04 职场文书
党支部承诺书
2015/01/20 职场文书
分享MySQL常用 内核 Debug 几种常见方法
2022/03/17 MySQL
Pillow图像处理库安装及使用
2022/04/12 Python