赞
踩
状态模式允许对象在内部状态改变时改变其行为,对象看起来好像修改了它的类。
这张图展示了一个典型的软件设计模式——状态模式(State Pattern)的架构概念。状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。在这个模式中,定义了一个状态接口(尽管在图中并未直接标出接口名称),它声明了一个或多个处理函数(Handle()),这些函数用于处理在特定状态下的请求。
图中主要包含以下几个关键组件:
上下文(Context):上下文类负责维护当前状态对象,并定义了一个或多个方法来改变当前状态以及触发状态处理函数。在图中,上下文通过接收一个请求(Request())来触发状态的改变,这个请求通过一个箭头指向了状态(State),表示请求是触发状态变化的原因。
状态(State):这是一个抽象类或接口,定义了所有可能的状态以及一个或多个处理函数(Handle())。这些处理函数用于执行与状态相关的操作。在图中,状态接口通过虚线表示,暗示它可能是抽象的,并未直接给出实现细节。
处理函数(Handle()):这是状态接口中定义的方法,用于在特定状态下处理请求。当上下文中的状态改变时,会调用当前状态对象的处理函数来响应请求。
具体状态(ConcreteStateA, ConcreteStateB):这些是实现了状态接口的具体类,每个类都实现了处理函数的具体逻辑。在图中,有两个具体状态类ConcreteStateA和ConcreteStateB,它们各自有自己的处理函数实现,但具体实现细节未在图中展示。
状态转换:图中通过箭头从状态指向处理函数(state->Handle())来表示当状态被激活时,相应的处理函数将被调用。这种转换是由上下文中的请求触发的,上下文负责维护当前状态,并根据请求改变状态。
总的来说,这张图通过图形化的方式展示了状态模式的核心概念,即如何根据不同的状态来改变对象的行为。通过定义状态接口和具体状态类,可以在不修改上下文类代码的情况下增加新的状态或修改现有状态的行为,从而提高了系统的可扩展性和可维护性。
以下是一个使用状态模式的C++代码示例,模拟一个简单的文档工作流,包含草稿、审核和发布三个状态。
状态接口:
#include <iostream>
#include <string>
// 前向声明
class Document;
class State {
public:
virtual void handleRequest(Document* document) = 0;
virtual ~State() = default;
};
具体状态类:
class Draft : public State {
public:
void handleRequest(Document* document) override;
};
class Moderation : public State {
public:
void handleRequest(Document* document) override;
};
class Published : public State {
public:
void handleRequest(Document* document) override;
};
文档类(上下文):
class Document { private: State* state; public: Document(State* state) : state(state) {} void setState(State* state) { this->state = state; } void request() { state->handleRequest(this); } void displayState(const std::string& stateName) { std::cout << "Document is now in " << stateName << " state." << std::endl; } };
具体状态类实现:
void Draft::handleRequest(Document* document) {
std::cout << "Document is in draft state. Moving to moderation." << std::endl;
document->setState(new Moderation());
document->displayState("Moderation");
}
void Moderation::handleRequest(Document* document) {
std::cout << "Document is in moderation state. Moving to published." << std::endl;
document->setState(new Published());
document->displayState("Published");
}
void Published::handleRequest(Document* document) {
std::cout << "Document is already published. No further action." << std::endl;
}
客户端代码:
int main() {
Document* document = new Document(new Draft());
document->request(); // From Draft to Moderation
document->request(); // From Moderation to Published
document->request(); // Already Published
delete document;
return 0;
}
优点:
缺点:
状态模式在以下场景中应用较多:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。