PHP设计模式程序员

状态设计模式

2018-02-27  本文已影响9人  wudanyang

什么是状态设计模式

类图如下:


状态设计模式

这个可以理解为对象行为随着状态改变的一个设计模式

如,随着四季变化,树的行为也跟着变化。

随着开关的变化,灯泡的行为也跟着变化。

为什么要使用

在软件设计过程中,对象的状态可能是会发生改变的,当对象的状态改变之后,我们可以使用 if 或者 switch 语句来判断对象的行为,但是如果对象的状态特别多的话,就会发生一个问题,对象的状态增加修改之后会频繁修改原来的类。

使用状态设计模式时,允许一个对象在其内部状态改变时改变它的行为。

类型

行为型模式

参与者

例子

只有两种状态的灯泡

代码中 Light 代表 Context 上下文类

<?php

/**
 * 只有两种状态的灯泡,可以开启和关闭
 */

/**
 * 灯
 */
class Light
{
    private $offState;
    private $onState;

    /**
     * @var IState
     */
    private $currentState;

    public function __construct()
    {
        $this->offState = new offState($this);
        $this->onState = new onState($this);
        $this->currentState = $this->offState;
    }

    public function turnOn()
    {
        $this->currentState->turnOn();
    }

    public function turnOff()
    {
        $this->currentState->turnOff();
    }

    public function setState(IState $state)
    {
        $this->currentState = $state;
    }

    public function getOnState()
    {
        return $this->onState;
    }

    public function getOffState()
    {
        return $this->offState;
    }
}

interface IState
{
    public function turnOn();

    public function turnOff();
}

/**
 * 灯的关闭状态
 */
class offState implements IState
{
    private $context;

    public function __construct(Light $light)
    {
        $this->context = $light;
    }

    public function turnOff()
    {
        echo 'light is already **off**, please chose another operation'.PHP_EOL;
    }

    public function turnOn()
    {
        echo 'light on!'.PHP_EOL;
        $this->context->setState($this->context->getOnState());
    }
}

/**
 * 灯的开启状态
 */
class onState implements IState
{
    private $context;

    public function __construct(Light $light)
    {
        $this->context = $light;
    }

    public function turnOff()
    {
        echo 'light off!'.PHP_EOL;
        $this->context->setState($this->context->getOffState());
    }

    public function turnOn()
    {
        echo 'light is already **on**, please chose another operation'.PHP_EOL;
    }
}

class Client
{
    private $light;

    public function __construct()
    {
        $this->light = new Light();
        $this->light->turnOn();
        $this->light->turnOn();
        $this->light->turnOff();
        $this->light->turnOff();
    }
}

$client = new Client();

新增加一种损坏状态

<?php

// 状态模式设计方法

/**
 * 灯
 */
class Light
{
    private $offState;
    private $onState;
    private $brokenState;

    /**
     * @var IState
     */
    private $currentState;

    public function __construct()
    {
        $this->offState = new offState($this);
        $this->onState = new onState($this);
        $this->brokenState = new brokenState();
        $this->currentState = $this->offState;
    }

    public function turnOn()
    {
        $this->currentState->turnOn();
    }

    public function turnOff()
    {
        $this->currentState->turnOff();
    }

    public function brokeIt()
    {
        $this->currentState->turnBroken();
    }

    public function setState(IState $state)
    {
        $this->currentState = $state;
    }

    public function getOnState()
    {
        return $this->onState;
    }

    public function getOffState()
    {
        return $this->offState;
    }

    public function getBrokeState()
    {
        return $this->brokenState;
    }
}

interface IState
{
    public function turnOn();

    public function turnOff();

    public function turnBroken();
}

/**
 * 灯的关闭状态
 */
class offState implements IState
{
    private $context;

    public function __construct(Light $light)
    {
        $this->context = $light;
    }

    public function turnOff()
    {
        echo 'light is already **off**, please chose another operation'.PHP_EOL;
    }

    public function turnOn()
    {
        echo 'light on!'.PHP_EOL;
        $this->context->setState($this->context->getOnState());
    }

    public function turnBroken()
    {
        echo 'light is broke now'.PHP_EOL;
        $this->context->setState($this->context->getBrokeState());
    }
}

/**
 * 灯的开启状态
 */
class onState implements IState
{
    private $context;

    public function __construct(Light $light)
    {
        $this->context = $light;
    }

    public function turnOff()
    {
        echo 'light off!'.PHP_EOL;
        $this->context->setState($this->context->getOffState());
    }

    public function turnOn()
    {
        echo 'light is already **on**, please chose another operation'.PHP_EOL;
    }

    public function turnBroken()
    {
        echo 'light broken now'.PHP_EOL;
        $this->context->setState($this->context->getBrokeState());
    }
}

/**
 * 新增一个损坏状态
 *
 * Class brokenState
 */
class brokenState implements IState
{
    public function turnOn()
    {
        echo 'light is broken, can not open now'.PHP_EOL;
    }

    public function turnOff()
    {
        echo 'light is already off, because it is broken.'.PHP_EOL;
    }

    public function turnBroken()
    {
        echo 'light is already broken.'.PHP_EOL;
    }
}

/**
 * Class Client
 */
class Client
{
    private $light;

    public function __construct()
    {
        $this->light = new Light();
        $this->light->turnOn();
        $this->light->turnOn();
        $this->light->turnOff();
        $this->light->turnOff();
        $this->light->brokeIt();
        $this->light->turnOn();
        $this->light->turnOff();
    }
}

$client = new Client();

light on!
light is already **on**, please chose another operation
light off!
light is already **off**, please chose another operation
light is broke now
light is broken, can not open now
light is already off, because it is broken.
上一篇下一篇

猜你喜欢

热点阅读