<aside> 💡

状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来相似改变了其类

</aside>

结构图

image.png

优点与应用场景

优点

应用场景

题目

https://kamacoder.com/problempage.php?pid=1097

#include <iostream>
#include <string>

// 1.定义状态接口:创建一个状态接口,该接口声明了对象可能的各种状态对应的方法。
class LampState{
public:
    // 涉及到状态的转换时,这里需要传入一个Context*
    virtual std::string handler() = 0;
};

// 2.实现具体状态类:为对象可能的每种状态创建具体的状态类,实现状态接口中定义的方法。
class OnState: public LampState{
public:
    virtual std::string handler() override {
        return "Light is ON";
    }
};

class OffState: public LampState{
public:
    virtual std::string handler() override {
        return "Light is OFF";
    }
};

class BlinkState: public LampState{
public:
    virtual std::string handler() override {
        return "Light is Blinking";
    }
};

// 3.创建上下文类:该类包含对状态的引用,并在需要时调用当前状态的方法。
class Context{
private:
    LampState* lampState;

public:
    Context(): lampState(new OffState()){}

    ~Context(){
        delete lampState;
    }

    void setState(LampState* newState){
        delete lampState;
        lampState = newState;
    }

    void controlLamp(){
        std::cout << lampState->handler() << std::endl;
    }
};

// 4.客户端使用:创建具体的状态对象和上下文对象,并通过上下文对象调用相应的方法。
//   通过改变状态,可以改变上下文对象的行为
int main(){
    int n;
    std::cin >> n;

    Context context;
    for(int i = 0; i < n; ++i){
        std::string state;
        std::cin >> state;
        if(state == "ON"){
            context.setState(new OnState());
        }else if(state == "OFF"){
            context.setState(new OffState());
        }else if(state == "BLINK"){
            context.setState(new BlinkState());
        }else{
            std::cout << "Invalid Input" << std::endl;
            continue;
        }
        context.controlLamp();
    }
    return 0;
}