【设计模式】状态模式

一,定义

状态模式:行为型模式之一,状态模式简单来说就是使用不同的状态,来描述一个在有限状态中转化的问题。同时使用不同状态下不同的响应方式,来对有限问题做出解决。

二,类图

【设计模式】状态模式_第1张图片

三,成员职责

  • 环境角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换

  • 抽象状态角色:声明了状态反应方式,负责不同状态下使环境角色做出不同的行为。

  • 具体状态角色:实现了抽象状态类中声明的状态反应方式,并且在需要的情况下进行状态切换

四,实现

我们给出以下场景:

公主亲青蛙,青蛙变成王子

当状态发生变化时,青蛙转变为王子

【设计模式】状态模式_第2张图片

抽象状态接口(抽象状态类)

class Stage
{
public:
    virtual void response() = 0;
};

青蛙状态(具体状态类)

class Frog : public Stage
{
public:
    void response() override
    {
        cout << "我是青蛙,呱呱呱..." << endl;
    }
};

王子状态(具体状态类)

class Prince : public Stage
{
public:
    void response() override
    {
        cout << "daring,我变成了王子" << endl;
    }
};

生物{初始状态为青蛙}(环境类)

class creater
{
private:
    Stage* stage;
public:
    creater()
    {
        stage = new Frog();
    }
    void kiss()
    {
        delete stage;
        stage = new Prince();
    }
    void behavior()
    {
        stage->response();
    }
};

测试方法与主函数

void test()
{
    creater cr;
    cout << "一开始有一个青蛙:" << endl;
    cr.behavior();
    cout << endl;

    cout << "公主亲了青蛙后:" << endl;
    cr.kiss();
    cr.behavior();
}

int main()
{
    test();
}
【设计模式】状态模式_第3张图片

五,优缺点

优点:

  • 结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割成不同的类,满足“单一职责原则”

缺点:

  • 状态模式对开闭原则的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源码,否则无法切换到新增状态,而且修改某个状态类的行为也需要修改对应类的源码。

六,适用场景

  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。

  • 一个操作中含有庞大的分支结构(if...else...和switch...case...),并且这些分支决定于对象的状态时。

你可能感兴趣的:(设计模式,状态模式,设计模式)