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数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
分享一则PHP定义函数代码
Feb 26 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
php+ajax无刷新上传图片的实现方法
Dec 06 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 01 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 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无限遍历文件夹示例分享
2014/03/04 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
2010/10/17 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
分享Python开发中要注意的十个小贴士
2016/08/30 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
阿拉伯书店:Jamalon
2019/07/24 全球购物
函授本科毕业自我鉴定
2013/10/09 职场文书
高一数学教学反思
2014/02/07 职场文书
运动会的口号
2014/06/09 职场文书
个人先进事迹材料
2014/12/29 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
python如何读取.mtx文件
2021/04/22 Python
Java 数组的使用
2022/05/11 Java/Android