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 base64+gzinflate压缩编码和解码代码
Oct 03 PHP
php mssql 时间格式问题
Jan 13 PHP
Php 构造函数construct的前下划线是双的_
Dec 08 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
php实现简单的MVC框架实例
Sep 23 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
Mar 16 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 17 PHP
PHP实现普通hash分布式算法简单示例
Aug 06 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 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边学边教》(01.开篇――准备工作)
2006/12/13 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
2019/12/12 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
js表数据排序 sort table data
2009/02/18 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
JS前端加密算法示例
2016/12/22 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
node和vue实现商城用户地址模块
2018/12/05 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
python3图片转换二进制存入mysql
2013/12/06 Python
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
django实现用户登陆功能详解
2017/12/11 Python
Django 实现下载文件功能的示例
2018/03/06 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
简单了解Django ContentType内置组件
2019/07/23 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
python+requests接口自动化框架的实现
2020/08/31 Python
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
给酒店员工的表扬信
2014/01/11 职场文书
公司保密承诺书
2014/03/27 职场文书
低碳生活倡议书
2014/04/14 职场文书
关于环保的演讲稿
2014/05/10 职场文书
大学生标准自荐书
2014/06/15 职场文书
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技
Vue深入理解插槽slot的使用
2022/08/05 Vue.js