设计模式–状态模式
思路
把不同的状态和行为分别封装成一个个类,根据不同状态实现不同的行为。
优点
1.解耦状态和行为:将状态的逻辑封装在各自的状态类中,使得状态的变化和行为的处理分离,降低了代码的耦合度。
2.增强可维护性和可扩展性:新增状态只需添加新的状态类,不影响原有代码,易于维护和扩展。
3.提高代码的可读性和清晰度:通过将状态相关的逻辑集中在特定的类中,使得代码结构更清晰,易于理解。
4.简化复杂的条件判断:避免在一个大的类中使用大量的条件语句来处理不同的状态,使代码更简洁。
5.支持状态的动态切换:可以在运行时根据条件灵活地切换对象的状态,实现不同的行为。
设计
这是一个电灯的设计,有不同的状态,在创建设备的时候就是开灯状态,之后可以灵活的切换状态。
#include <iostream>
// 状态抽象类
class LightState {
public:
virtual void on(Light* light) = 0;
virtual void off(Light* light) = 0;
};
// 开状态
class OnState : public LightState {
public:
void on(Light* light) override {
std::cout << "灯已经是开着的。" << std::endl;
}
void off(Light* light) override {
std::cout << "关灯。" << std::endl;
light->setState(new OffState());
}
};
// 关状态
class OffState : public LightState {
public:
void on(Light* light) override {
std::cout << "开灯。" << std::endl;
light->setState(new OnState());
}
void off(Light* light) override {
std::cout << "灯已经是关着的。" << std::endl;
}
};
// 电灯类
class Light {
private:
LightState* state;
public:
Light() {
state = new OffState();
}
void setState(LightState* newState) {
delete state;
state = newState;
}
void turnOn() {
state->on(this);
}
void turnOff() {
state->off(this);
}
};
int main() {
Light light;
light.turnOn();
light.turnOff();
light.turnOn();
return 0;
}
在外部只需要调用不同的设备动作的函数即可,不需要管内容是如何运作的。