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.MVC的模板标签系统(四)
Sep 05 PHP
Zend Framework中的简单工厂模式 图文
Jul 10 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
php中获取主机名、协议及IP地址的方法
Nov 18 PHP
PHP.ini安全配置检测工具pcc简单介绍
Jul 02 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
PDO::beginTransaction讲解
Jan 27 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
laradock环境docker-compose操作详解
Jul 29 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修改文件上传限制方法汇总
2015/04/07 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
range 标准化之获取
2011/08/28 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
python日志记录模块实例及改进
2017/02/12 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
Python读取YAML文件过程详解
2019/12/30 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
总经理司机职责
2014/02/02 职场文书
行政主管职责范本
2014/03/07 职场文书
小学优秀教师材料
2014/12/15 职场文书
大学学生个人总结
2015/02/15 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
外出考察学习心得体会
2016/01/18 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书