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代码优化之成员变量获取速度对比
Feb 28 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
php实现读取内存顺序号
Mar 29 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
php判断当前操作系统类型
Oct 28 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
深入理解PHP原理之执行周期分析
Jun 01 PHP
PHP新特性详解之命名空间、性状与生成器
Jul 18 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 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 sdk文档处理常用代码示例解析
2020/12/09 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
js数组去重的方法总结
2019/01/18 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
2019/03/02 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
Django中使用group_by的方法
2015/05/26 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
师范生实习个人的自我评价
2013/09/28 职场文书
个人现实表现材料
2014/02/04 职场文书
讲党性心得体会
2014/09/03 职场文书
长城的导游词
2015/01/30 职场文书
小平您好观后感
2015/06/09 职场文书
三十年同学聚会感言
2015/07/30 职场文书