C++ 设计模式:状态模式(State Pattern)
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为。状态模式将状态的行为封装在独立的状态类中,并将状态的切换逻辑委托给这些状态类,从而使得对象的行为随着状态的变化而变化。
1.问题分析
在开发中,我们经常会遇到对象的行为随着其内部状态的变化而变化的情况。如果我们将所有状态的行为都放在一个类中,会导致以下问题:
- 代码复杂度增加:所有状态的行为都在一个类中实现,代码会变得非常复杂和难以维护。
- 难以扩展:如果需要添加新的状态或修改现有状态的行为,需要修改这个类的代码,违反了开闭原则(对扩展开放,对修改关闭)。
- 状态切换逻辑混乱:状态切换的逻辑和状态的行为混在一起,难以理解和维护。
状态模式通过将状态的行为封装在独立的状态类中,并将状态的切换逻辑委托给这些状态类,从而解决了上述问题。
2.实现步骤
1.定义状态接口:声明所有具体状态类需要实现的方法。
2.定义具体状态类:实现状态接口中的方法,并根据具体状态的行为进行实现。
3.定义上下文类:维护一个当前状态的实例,并提供方法来设置和切换状态。上下文类的方法会调用当前状态实例的方法。
3.代码示例
以机器人状态示例。
3.1.状态接口
// 状态接口
class State {
public:
virtual ~State() = default;
virtual void handle() = 0;
};
3.2.具体状态
// 具体状态类:站起状态
class StandingState : public State {
public:
void handle() override { std::cout << "Robot is standing." << std::endl; }
};
// 具体状态类:行走状态
class WalkingState : public State {
public:
void handle() override { std::cout << "Robot is walking." << std::endl; }
};
// 具体状态类:挥手状态
class WavingState : public State {
public:
void handle() override { std::cout << "Robot is waving." << std::endl; }
};
// 具体状态类:蹲下状态
class SquattingState : public State {
public:
void handle() override { std::cout << "Robot is squatting." << std::endl; }
};
3.3.上下文类
// 上下文类
class Robot {
public:
Robot(std::shared_ptr<State> state) : state_(state) {}
void setState(std::shared_ptr<State> state) { state_ = state; }
void performAction() { state_->handle(); }
private:
std::shared_ptr<State> state_;
};
3.4.客户端代码
int main() {
auto standingState = std::make_shared<StandingState>();
auto walkingState = std::make_shared<WalkingState>();
auto wavingState = std::make_shared<WavingState>();
auto squattingState = std::make_shared<SquattingState>();
Robot robot(standingState); // 初始状态为站起
robot.performAction(); // 输出:Robot is standing.
robot.setState(walkingState); // 切换状态为行走
robot.performAction(); // 输出:Robot is walking.
robot.setState(wavingState); // 切换状态为挥手
robot.performAction(); // 输出:Robot is waving.
robot.setState(squattingState); // 切换状态为蹲下
robot.performAction(); // 输出:Robot is squatting.
return 0;
}
原文地址:https://blog.csdn.net/sinat_27236401/article/details/144359866
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!