您的位置:首页 > 其它

状态设计模式

2016-07-06 23:57 183 查看
每一个行动中,我们必须把目光放到我们的过去、现在和将来的行动之外,

还要超越这些行为影响到的其他人,而看到所有这一切之间的关系,

这样一来,我们就会非常的谨慎 - 布莱士·帕斯卡

什么是状态模式

状态设计模式是GoF提出的最吸引人的模式之一,也是最有用的一种模式,游戏通常就采用状态模式,因为游戏中的对象往往会非常频繁的改变状态

状态模式的作用就是允许对象在状态改变时改变其行为

最基本的场景例子(比起全部判断语句的做法,这不是更好么)

开灯关灯

扩展 开灯->加亮->再加亮->关灯

九宫格的数字移动游戏

// 只做开灯关灯例子说明
// context.php
class context {
private $offState;
private $onState;
private $currentState;
function __contruct() {
$this->offState = new offState($this);
$this->onState = new onState($this);
// 开始状态为Off
$this->currentState = $this->offState;
}
// 调用此方法触发器
public function turnOnLight() {
$this->currentState->turnLightOn();
}
public function turnOffLight() {
$this->currentState->turnLightOff();
}
// 设置状态
public function setState(IState $state) {
$this->currentState = $state;
}
// 获取状态
public function getOnState() {
return $this->onState;
}
public function getOffState() {
return $this->offState;
}
}
// 实现状态接口
interface IState {
public function turnLightOn();
public function turnLightOff();
}

// 实现类 OnState 与 OffState
class OnState implements IState {
private $context;
public function __construct(Content $contentNow) {
$this->context = $contentNow;
}
public function turnLightOn() {
echo 'light is already on -> take on action <br />';
}
public function turnLightOff() {
echo 'lights off! <br/>';
$this->context->setStats($this->context->getoffState());
}
}

class OffState implements IState {
private $context;
public function __construct(Content $contentNow) {
$this->context = $contentNow;
}
public function turnLightOn() {
echo 'lights on! <br/>';
$this->context->setStats($this->context->getOnState());
}
public function turnLightOff() {
echo 'light is already off -> take on action <br />';

}
}
// Client.php
function __autoload($class_name) {
include $class_name.'.php';
}
class Client {
private $context;
public function __construct() {
$this->context = new context();

b3c1
$this->context->turnOnLight();
$this->context->turnOnLight();
$this->context->turnOffLight();
$this->context->turnOffLight();
}
}
$worker = new Client();
/**
* 实例化一个Context 实例之后,初始请求是打开灯,因为灯默认是关的 ,请求显示的结果如下
* lights on!
* light is already on -> take on action
* lights off!
* light is already off -> take on action
*/


简要说明

OnState 与OffState类是IState 的简单实现,这两个状态实现类在构造函数中包含了Context类的一个引用,所以Context 会实例化状态实例,并为状态构造函数类提供一个自引用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式