<aside> 💡
状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来相似改变了其类
</aside>
优点
应用场景
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;
}