标签:设计模式 状态模式
<?php /** * 3.4 状态模式 * 定义: * 当一个对象的内在状态改变时允许改变其行为,这个对象看 * 起来像是改变了其类。 * 角色: * 1. 抽象状态类 * 职责:定义一个接口以封装与Context的一个特定状态 * 相关的行为。 * 2. 具体状态类 * 职责:每一个具体的状态类实现一个与Context的一个 * 状态相关的行为。 * 3. Context类 * 职责:维护一个具体状态类的实例,这个实例定义当前 * 的状态。 * 优点: * 1. 将与特定状态相关的行为局部化,并且将不同状态的行 * 为分隔开来。 * 缺点: * 1. 会增加类和对象的个数; * 2. 此模式的机构和实现都比较复杂,如果使用不当将导致 * 程序结构和代码的混乱。 * 使用场景: * 1. 如果一个对象的行为取决于它的状态,并且它必须在 * 运行时,时刻根据状态改变它的行为。 * 2. 一个操作中含有庞大的多分支条件语句,且这些分支 * 依赖于该对象的状态。 */ header(‘content-type:text/html;charset=utf8‘); //抽象状态类 abstract class State{ abstract public function handle(Context $context); } //具体状态类 class ConcreteStateA extends State{ public function handle(Context $context){ $context->setState(new ConcreteStateB()); } } class ConcreteStateB extends State{ public function handle(Context $context){ $context->setState(new ConcreteStateC()); } } class ConcreteStateC extends State{ public function handle(Context $context){ $context->setState(new ConcreteStateA()); } } //Context类 class Context{ private $state; public function __construct(State $state){ $this->state=$state; } public function setState($state){ $this->state=$state; echo ‘当前状态:‘.get_class($this->state); } public function getState(){ return $this->state; } public function request(){ $this->state->handle($this); } } //客户端 $context1=new Context(new ConcreteStateB()); $context1->request();
本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614786
标签:设计模式 状态模式
原文地址:http://noican.blog.51cto.com/4081966/1614786