您的位置:首页 > 其它

状态模式

2015-12-07 15:39 232 查看
状态模式解析:
主体类下面有一个状态切换方法,专门根据指令切换状态
切换状态的本质,是把一个新的对象给主体类的一个成员属性


<?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();
//坦克回普通模式
$tank->setState('t');
//坦克再次攻击,这次是普通模式
$tank->attack();
?>


用途总结:状态模式可以将和状态相关的行为和属性封装,除了切换状态时,其它地方就不需要大量的判断当前状态,只要调用当前状态的方法等。

实现总结:用一个接口规范状态类需要实现的方法,比如上面的TankState规定了attack()。把各个状态封装成类,将不同状态下的不同方法放入各自的状态类,比如上面的攻击方法,同时所有的状态执行接口。原来的事务类,比如上面的Tank类,只负责状态切换,一旦需要某一个方法的调用,只要交给当前状态就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: