状态设计模式
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 会实例化状态实例,并为状态构造函数类提供一个自引用相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用