状态设计模式

每一个行动中,我们必须把目光放到我们的过去、现在和将来的行动之外,
还要超越这些行为影响到的其他人,而看到所有这一切之间的关系,
这样一来,我们就会非常的谨慎 - 布莱士·帕斯卡

什么是状态模式

  • 状态设计模式是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();
        $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 会实例化状态实例,并为状态构造函数类提供一个自引用
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值