这篇文章主要介绍了php设计模式之状态模式,结合星际争霸游戏案例形式分析了php状态模式相关原理、使用技巧与注意事项,需要的朋友可以参考下
本文实例讲述了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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
本文标题为:php设计模式之状态模式实例分析【星际争霸游戏案例】
基础教程推荐
- PHP如何将头像图片转换圆形图片 2023-08-30
- php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次) 2023-04-24
- PHP树形结构tree类用法示例 2022-12-15
- PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案 2022-11-26
- php fread函数使用方法总结 2023-01-19
- PHP中的输出缓冲控制详解 2023-06-03
- CentOS 7 编译安装PHP7 2023-09-02
- PHP设计模式之状态模式定义与用法详解 2022-10-12
- 在laravel中实现事务回滚的方法 2023-02-22
- 解析PHP中Exception异常机制 2023-06-13
