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 相关文章推荐
我的论坛源代码(八)
Oct 09 PHP
PHP入门速成教程
Mar 19 PHP
php实现网站插件机制的方法
Nov 10 PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
深入探究PHP的多进程编程方法
Aug 18 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 PHP
PHP自定义函数实现数组比较功能示例
Oct 19 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
Laravel获取所有的数据库表及结构的方法
Oct 10 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
一些mootools的学习资源
2010/02/07 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
Python 多核并行计算的示例代码
2017/11/07 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
Python实现石头剪刀布游戏
2021/01/20 Python
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
师德个人剖析材料
2014/02/02 职场文书
业务总经理岗位职责
2014/02/03 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
小班上学期个人总结
2015/02/12 职场文书
通知格式
2015/04/27 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书