手机网站如何推广,网页制作用哪个软件,国外游戏网站欣赏,Asp做网站前期准备文章目录 一.什么是状态模式#xff1f;二.状态模式的结构三.状态模式的应用场景四.状态模式的优缺点五.状态模式的C实现六.状态模式的JAVA实现七.代码解释八.总结 类图#xff1a;
状态设计模式类图 一.什么是状态模式#xff1f; 状态模式#xff08;State Pattern… 文章目录 一.什么是状态模式二.状态模式的结构三.状态模式的应用场景四.状态模式的优缺点五.状态模式的C实现六.状态模式的JAVA实现七.代码解释八.总结 类图
状态设计模式类图 一.什么是状态模式 状态模式State Pattern是一种行为型设计模式允许对象在其内部状态改变时改变其行为看起来就像对象改变了其类。状态模式通过将状态封装为独立的类使得对象的行为能够根据内部状态动态地改变。 在状态模式中Context环境类持有一个指向State状态接口的引用对象并通过该对象来进行状态切换。具体的状态通过实现状态接口的不同子类来进行封装。
二.状态模式的结构
Context环境类用于维护当前状态并在特定操作时切换状态。它持有一个State对象的引用用来对状态进行操作。State状态接口定义了一个接口声明了每个具体状态需要实现的行为。ConcreteStateA 和 ConcreteStateB具体状态类实现State接口的不同子类表示对象在不同状态下的行为。
三.状态模式的应用场景
对象行为依赖于状态且状态在运行时变化如电梯的状态上升、下降、停止、游戏角色的状态跑步、跳跃、静止。条件语句过多当对象中有大量if-else或switch语句判断状态时可以考虑使用状态模式进行优化。
四.状态模式的优缺点 优点: 封装状态转换将状态与相关行为封装在一个类中便于维护和扩展。避免条件判断通过多态替代了条件判断代码更具可读性和扩展性。 缺点: 类数量增加每个状态需要一个类可能会导致类数量较多。
五.状态模式的C实现
#include iostream
#include memory// 前置声明避免循环引用
class State;// 环境类Context
class Context {
private:std::shared_ptrState state; // 当前状态public:// 设置当前状态void setState(std::shared_ptrState newState) {state newState;}// 执行请求调用当前状态的Handle方法void request();
};// 状态接口State
class State {
public:virtual void handle(Context context) 0; // 定义纯虚函数具体状态类需实现
};// 具体状态类 AConcreteStateA
class ConcreteStateA : public State {
public:void handle(Context context) override {std::cout ConcreteStateA handling request.\n;// 状态切换可以切换到状态 Bcontext.setState(std::make_sharedConcreteStateB());}
};// 具体状态类 BConcreteStateB
class ConcreteStateB : public State {
public:void handle(Context context) override {std::cout ConcreteStateB handling request.\n;// 状态切换可以切换回状态 Acontext.setState(std::make_sharedConcreteStateA());}
};// 环境类方法的实现
void Context::request() {if (state) {state-handle(*this); // 调用当前状态的 handle 方法}
}// 测试代码
int main() {Context context;// 初始化状态为 Acontext.setState(std::make_sharedConcreteStateA());// 执行多次请求测试状态切换context.request(); // ConcreteStateA 处理请求然后切换到 ConcreteStateBcontext.request(); // ConcreteStateB 处理请求然后切换到 ConcreteStateAcontext.request(); // ConcreteStateA 处理请求然后切换到 ConcreteStateBreturn 0;
}六.状态模式的JAVA实现
// 抽象状态类
abstract class State {public abstract void Handle(Context context);
}// 具体状态A
class ConcreteStateA extends State {Overridepublic void Handle(Context context) {System.out.println(ConcreteStateA: Handling request and transitioning to ConcreteStateB.);context.setState(new ConcreteStateB());}
}// 具体状态B
class ConcreteStateB extends State {Overridepublic void Handle(Context context) {System.out.println(ConcreteStateB: Handling request and transitioning to ConcreteStateA.);context.setState(new ConcreteStateA());}
}// 环境类 (Context)
class Context {private State state;public Context(State state) {this.state state;}public void setState(State state) {this.state state;}public void Request() {if (state ! null) {state.Handle(this);}}
}// 客户端代码
public class StatePatternDemo {public static void main(String[] args) {// 初始状态为 ConcreteStateAContext context new Context(new ConcreteStateA());// 调用多次 Request观察状态切换context.Request(); // 从 A 切换到 Bcontext.Request(); // 从 B 切换到 Acontext.Request(); // 再次从 A 切换到 B}
}七.代码解释
Context 类 Context类持有一个指向State的指针使用智能指针std::shared_ptr来管理状态对象的生命周期。它包含一个request()方法用于请求当前状态处理相应的操作。setState()方法用于切换状态方便在运行时改变state的引用指向不同的State对象。 State 接口 State接口中定义了一个纯虚函数handle()表示不同状态下的行为。Context通过调用state-handle(*this)来执行当前状态的具体行为。 ConcreteStateA 和 ConcreteStateB ConcreteStateA和ConcreteStateB是State接口的具体实现类每个类都定义了各自的handle()方法。在ConcreteStateA::handle()中Context的状态被切换为ConcreteStateB而在ConcreteStateB::handle()中状态切换回ConcreteStateA。这种状态切换体现了状态模式的核心思想即状态内部控制状态转换客户端不需要关心状态如何切换。 测试代码 在main函数中创建Context对象context并将初始状态设为ConcreteStateA。通过多次调用request()方法可以看到状态在ConcreteStateA和ConcreteStateB之间切换体现出对象行为随状态变化而变化的特点。
八.总结 状态模式是一种非常适合解决对象行为依赖于状态变化的设计模式。通过将状态封装为独立的类状态模式使得代码更加清晰和易于维护避免了条件判断语句的冗余和复杂性。每个具体状态类不仅实现了各自的行为还决定了状态切换的逻辑从而让状态之间的转换更为灵活。 关键点
状态模式封装了对象内部的状态变化逻辑使得对象的行为可以动态改变。通过多态状态模式避免了条件判断使代码更具可扩展性。状态切换由具体状态类控制客户端只需与Context交互降低了耦合度。