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开源XNA 聚合程序发布 下载
Jul 13 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
Nov 11 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 PHP
thinkphp模板赋值与替换实例简述
Nov 24 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
composer.lock文件的作用
Feb 03 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
php实现mysql连接池效果实现代码
Jan 25 PHP
PHP实现生成推广海报的方法详解
Mar 14 PHP
php实现大文件断点续传下载实例代码
Oct 01 PHP
PHP如何解决微信文章图片防盗链
Dec 09 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为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
php微信开发之图片回复功能
2018/06/14 PHP
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python的Django框架安装全攻略
2015/07/15 Python
python3音乐播放器简单实现代码
2020/04/20 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
解决Python对齐文本字符串问题
2019/08/28 Python
python生成requirements.txt的两种方法
2019/09/18 Python
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
学校司机岗位职责
2013/11/14 职场文书
陈欧广告词
2014/03/14 职场文书
小学毕业演讲稿
2014/04/25 职场文书
鉴定评语大全
2014/05/05 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
先进个人申报材料
2014/12/30 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
捐款仪式主持词
2015/07/04 职场文书
关于使用Redisson订阅数问题
2022/01/18 Redis
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL