首页 > 编程知识 正文

C++设计模式-State状态模式

时间:2023-05-05 07:05:15 阅读:190462 作者:4114

状态模式

作用:当某个对象的内在状态发生变化时,允许改变其行为,该对象看起来改变了其类。

UML图如下所示。

一个State类,定义用于封装与上下文的特定状态相关联的行为的接口。

ConcreteState类、具体状态、每个子类实现与Context的一个状态相关的行为。

上下文类。 维护定义当前状态的ConcreteState子类的实例。

状态模式主要在控制对象状态转换的表达式过于复杂时解决。 通过将状态判断逻辑转移到表示不同状态的一系列类中,可以简化复杂的判断逻辑。

状态模式的优点是将与特定状态相关联的行为局部化和划分不同状态的行为。

如果将与特定状态相关的行为组合到一个对象中,则ConcreteState中将存在与状态相关的所有代码,因此可以通过定义新的子类轻松添加新的状态和转换。

可以消除庞大的条件分支句。 状态模式通过在State的子类之间分布各种状态转移逻辑来减少相互依赖。

如果对象的行为取决于其状态,并且需要在运行时根据状态更改行为,则可以考虑使用状态模式。

另外,当某个业务需要多个状态时,通常是列举常数,状态的变化通过多个多分支判断句来实现,在这种情况下,应该讨论将各个业务状态定义为一个State的子类。 这样,这些对象可以独立地变化,而不依赖于其他对象。

代码如下所示。

State.h

# ifndef _ state _ h _ # define _ state _ h _ class context; class state { public : virtualvoidhandle (context * p context )=0; ~State (; 受保护的:状态(; 私有: }; classconcretestatea :公共状态{公共:公共状态a (; ~ConcreteStateA (; 虚拟语音(context * p context ); 受保护的:私有: }; classconcretestateb :公共状态{公共: concretestateb (; ~ConcreteStateB (; 虚拟语音(context * p context ); 受保护的:私有: }; classconcretestatec :公共状态{公共: concretestatec (; ~ConcreteStateC (; 虚拟语音(context * p context ); 受保护的:私有: }; 类上下文{ public :上下文(state * pstate ); ~Context (; void Request (; voidchangestate(state*pstate; 受保护:私有:状态* _ state; (; #endifState.cpp

# include ' state.h ' # includeiostreamusingnamespacestd; state :3360 state ({ } state :~state ) { } concrete state a 33603360 } concrete a ) { } concrete 状态voidconcretestatea :3360 handle (context * p context ) { cout 'ConcreteStateA' endl; p上下文变更状态(newconcretestateb ) ); } concretestateb : concretestateb (} concretestateb :~concretestateb ) {}//执行此状态的操作,然后执行状态voidconcretetestestested } concretestatec : concretestatec ({ } concretestatec 3360:~concretestatec ) {}//执行此状态的操作,然后执行状态voidconcretetestestestated //定义_state的初始状态context :3360 context (state * pstate ) { this-_state=pState; }Context:~Context (() ) /处理请求并处于下一状态的void Context:Request ) ) if )为空!=this-_ state (this-_ state-handle ) this ); }//改变状态void context :3360 changestate (state * pstate ) { this-_state=pState; }main.cpp

#include 'State.h'int main () { state * pstate=new concrete state a ); context * p context=new context (pstate ); pContext-Request (; pContext-Request (; pContext-Request (; pContext-Request (; pContext-Request (; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。