状态模式解决灯开关状态问题

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。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值