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下关于中英数字混排的字符串分割问题
Apr 06 PHP
php不允许用户提交空表单(php空值判断)
Nov 12 PHP
windows下配置apache+php+mysql时出现问题的处理方法
Jun 20 PHP
php通过记录IP来防止表单重复提交方法分析
Dec 16 PHP
php中解析带中文字符的url函数分享
Jan 20 PHP
php使用mysqli向数据库添加数据的方法
Mar 20 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
PHP中array_keys和array_unique函数源码的分析
Feb 26 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 18 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php中取得URL的根域名的代码
2011/03/23 PHP
php引用传值实例详解学习
2013/11/06 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP发送短信代码分享
2015/08/11 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
python 实现归并排序算法
2012/06/05 Python
在Python中使用异步Socket编程性能测试
2014/06/25 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
python实现小球弹跳效果
2019/05/10 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
九年级数学教学反思
2014/02/02 职场文书
教师对学生的评语
2014/04/28 职场文书
领导干部保密承诺书
2014/08/30 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
党员倡议书
2015/01/19 职场文书