设计模式之状态模式

UML图

 

定义:(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

使用场景:当一个对象改变了状态,会影响这个对象能执行的行为。比如当我们灯控制开关,有两个行为:一个是开的行为,一个是关的行为。当灯是开的状态,只能执行关的行为;当灯是关的状态,只能执行开的行为。这个时候状态是改变了灯这个对象的行为的。

具体的代码实现:

//开关状态抽象接口 State.php
<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/23
 * Time: 14:34
 */
abstract class State
{
    public abstract function getState();
    public abstract function turnOn(OnOff $onOff);
    public abstract function turnOff(OnOff $onOff);
}

//开状态具体实现接口 OnState.php
<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/23
 * Time: 14:43
 */
class OnState extends State
{
    public function getState()
    {
        echo "当前状态为开\n";
    }

    public function turnOn(OnOff $onOff)
    {
        echo "当前状态为开状态,不能进行开操作\n";
    }

    public function turnOff(OnOff $onOff)
    {
        echo "已关\n";
        $onOff->setState(new OffState());
    }
}

//关状态具体实现接口 OffState.php
<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/23
 * Time: 14:43
 */
class OffState extends State
{
    public function getState()
    {
        echo "当前状态为关\n";
    }

    public function turnOn(OnOff $onOff)
    {
        echo "已开\n";
        $onOff->setState(new OnState());
    }

    public function turnOff(OnOff $onOff)
    {
        echo "当前状态为关状态,不能进行关操作\n";
    }
}

//开关控制类 OnOff.php
<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/23
 * Time: 14:34
 */
class OnOff
{
    public $state;

    public function getState()
    {
        return  $this->state->getState();
    }
    public function setState(State $state)
    {
        $this->state = $state;
    }
    public function turnOn()
    {
        $this->state->turnOn($this);
    }
    public function turnOff()
    {
        $this->state->turnOff($this);
    }

}

//入口文件 Main.php
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/23
 * Time: 14:51
 */

require_once 'AutoLoader.php';
spl_autoload_register('AutoLoader::AutoLoadClass');
header('Content-type:text/html;charset=utf8');

$onState = new OnState();
$onOff = new OnOff();
$onOff->setState($onState);
$onOff->getState();
$onOff->turnOn();
//echo "<pre>";
//var_dump($onOff);
$onOff->turnOff();
//var_dump($onOff);
$onOff->turnOn();
//var_dump($onOff);

//类自动加载类  AutoLoader.php
<?php

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/23
 * Time: 10:19
 */
class AutoLoader
{
    public static $classMap = [];
    public static function AutoLoadClass($class)
    {
        if(isset(self::$classMap[$class])) {
            return true;
        }
        $file = $class.'.php';
        if(file_exists($file)) {
            include $file;
            self::$classMap[$class] = $class;
        }
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值