複製鏈接
請複製以下鏈接發送給好友

狀態模式

鎖定
允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類
中文名
狀態模式
外文名
State

狀態模式簡介

(State Pattern)是設計模式的一種,屬於行為模式。

狀態模式定義

(源於Design Pattern):當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
狀態模式主要解決的是當控制一個對象狀態的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。

狀態模式意圖

允許一個對象在其內部狀態改變時改變它的行為

狀態模式適用場景

1.一個對象的行為取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行為。
2.一個操作中含有龐大的多分支結構,並且這些分支決定於對象的狀態。

狀態模式C++代碼

//頭文件
#include <iostream>
using namespace std;
class Context;//聲明
//抽象出來的狀態類
class State
{
public:
    /*抽象的接口,每個子類去實現這個接口
    根據自己的邏輯執行任務或者轉換狀態。
    */
    virtual void Handle(Context *context) = 0;
    //獲得當前的狀態
    virtual void GetState() = 0;
};
//狀態管理類
class Context
{
public:
    //初始化狀態
    Context(State *state)
    {
        m_pState = state;
    }
    //獲得當前的狀態
    State* GetState()
    {
        return m_pState;
    }
    //改變當前的狀態
    void SetState(State *state)
    {
        m_pState = state;
    }
    //執行狀態類實現的方法
    void Request()
    {
        m_pState->Handle(this);
    }
    State* m_pState;
};
//具體的狀態子類
class ConcreteStateA:public State
{
public:
    void Handle(Context *context);
    void GetState();
};
//具體的狀態子類
class ConcreteStateB:public State
{
public:
    void Handle(Context *context);
    void GetState();
};
//具體的狀態子類
class ConcreteStateC:public State
{
public:
    void Handle(Context *context);
    void GetState();
};
//cpp文件
#include "StateMode.h"
void ConcreteStateA:: Handle(Context *context)
{
    context->m_pState = new ConcreteStateB;
    cout<<"當前狀態是A,下一狀態是B"<<endl;
}
void ConcreteStateB:: Handle(Context *context)
{
    context->m_pState = new ConcreteStateC;
    cout<<"當前狀態是B,下一狀態是C"<<endl;
}
void ConcreteStateC:: Handle(Context *context)
{
    context->m_pState = new ConcreteStateA;
    cout<<"當前狀態是C,下一狀態是A"<<endl;
}
void ConcreteStateA:: GetState()
{
    cout<<"當前狀態是A"<<endl;
}
void ConcreteStateB:: GetState()
{
    cout<<"當前狀態是B"<<endl;
}
void ConcreteStateC:: GetState()
{
    cout<<"當前狀態是B"<<endl;
}
//main函數
#include "StateMode.h"
int main(void)
{
    //初始化A狀態
    Context* context = new Context(new ConcreteStateA);
    context->Request();
    context->Request();
    context->Request();
    getchar();
    return 0;
}