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在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
PHP编码转换
Nov 05 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
PHP+Javascript实现在线拍照功能实例
Jul 18 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 PHP
php 使用 __call实现重载功能示例
Nov 18 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 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数据类型判断函数有哪些
2013/09/23 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
基于 Node.js 实现前后端分离
2016/04/23 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
Python实现的IP端口扫描工具类示例
2019/02/15 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
物流专业求职计划书
2014/01/10 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers