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 相关文章推荐
投票管理程序
Oct 09 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php使用PDO方法详解
Dec 27 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
PHP使用curl制作简易百度搜索
Nov 03 PHP
laravel中的一些简单实用功能
Nov 03 PHP
PHP的mysqli_select_db()函数讲解
Jan 23 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
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
JS继承用法实例分析
2015/02/05 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
学习python (2)
2006/10/31 Python
python如何基于redis实现ip代理池
2020/01/17 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
浅谈Python 函数式编程
2020/06/20 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
小学教师的自我评价范例
2013/10/31 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
酒店个人求职信范文
2014/01/25 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
努力学习保证书
2015/02/26 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书