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 相关文章推荐
默默简单的写了一个模板引擎
Jan 02 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
May 12 PHP
php实现可运算的验证码
Nov 10 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 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/02/26 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
js里的prototype使用示例
2010/11/19 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
跟老齐学Python之永远强大的函数
2014/09/14 Python
python处理html转义字符的方法详解
2016/07/01 Python
python sqlite的Row对象操作示例
2019/09/11 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
Python求凸包及多边形面积教程
2020/04/12 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
PyQt 如何创建自定义QWidget
2021/03/24 Python
给同学的道歉信
2014/01/16 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
新生开学寄语大全
2015/05/28 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
Apache Hudi数据布局黑科技降低一半查询时间
2022/03/31 Servers