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生成图形(Libchart)实例
Nov 06 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
PHP的Yii框架的基本使用示例
Aug 21 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
Nov 15 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 PHP
php集成开发环境详解
Sep 24 PHP
php5与php7的区别点总结
Oct 11 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中使用CURL获取页面title例子
2015/01/07 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
python中base64加密解密方法实例分析
2015/05/16 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
python3转换code128条形码的方法
2019/04/17 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
青春无悔演讲稿
2014/05/08 职场文书
会计毕业生自荐书
2014/06/12 职场文书
数学教研活动总结
2014/07/02 职场文书
买卖合同协议书范本
2014/10/18 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js