CleverCode最近在研究状态设计模式,发现状态设计模式能够解决很多设计问题。
1 状态模式介绍
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2 模式组成
2.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
2.2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
2.3 具体状态(Concrete State):实现抽象状态定义的接口。
3 模式架构
4 项目应用
4.1 需求说明
设计一个灯开关控制器,能够实现灯的开关。
4.2 设计的uml类图
4.3 php代码如下
<?php
interface State
{/*{{{*/
/**
* 打开灯
*
* @access public
* @return void
*/
public function on();
/**
* 关闭灯
*
* @access public
* @return void
*/
public function off();
}/*}}}*/
//开关控制器
class LampSwitch
{/*{{{*/
public static $onState;
public static $offState;
public $state;
public function __construct()
{
self::$onState = new OnState($this);
self::$offState = new OffState($this);
//初始化状态
$this->state = self::$offState;
}
public function on()
{
$this->state->on();
}
public function off()
{/*{{{*/
$this->state->off();
}/*}}}*/
public function setState(State $state)
{/*{{{*/
$this->state = $state;
}/*}}}*/
}/*}}}*/
//打开状态
class OnState implements State
{/*{{{*/
public $lampSwitch;
public function __construct(LampSwitch $lampSwitch)
{
$this->lampSwitch = $lampSwitch;
}
//开灯
public function on()
{
//do nothing
}
//关灯
public function off()
{
echo "等关了.....\r\n";
$this->lampSwitch->setState(LampSwitch::$offState);
}
}/*}}}*/
//关闭状态
class OffState implements State
{/*{{{*/
public $lampSwitch;
public function __construct(LampSwitch $lampSwitch)
{
$this->lampSwitch = $lampSwitch;
}
//开灯
public function on()
{
echo "等开了.....\r\n";
$this->lampSwitch->setState(LampSwitch::$onState);
}
//关灯
public function off()
{
//do nothing
}
}/*}}}*/
function start()
{
$lampSwitch = new LampSwitch();
$lampSwitch->on();
$lampSwitch->off();
$lampSwitch->off();
$lampSwitch->off();
$lampSwitch->off();
$lampSwitch->off();
$lampSwitch->on();
$lampSwitch->on();
$lampSwitch->off();
$lampSwitch->off();
$lampSwitch->off();
$lampSwitch->off();
}
start();
?>
4.4 运行结果
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!