新闻资讯
看你所看,想你所想

状态模式

状态模式

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

基本介绍

  • 中文名:状态模式
  • 外文名:State

状态模式

(State Pattern)是设计模式的一种,属于行为模式。

定义

(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于複杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把複杂的判断逻辑简化。

意图

允许一个对象在其内部状态改变时改变它的行为

适用场景

1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

C++代码

//头档案#include <iostream>using namespace std;class Context;//声明//抽象出来的状态类class State{public:    /*抽象的接口,每个子类去实现这个接口    根据自己的逻辑执行任务或者转换状态。    */    virtual void Handle(Context *context) = 0;    //获得当前的状态    virtual void GetState() = 0;};//状态管理类class Context{public:    //初始化状态    Context(State *state)    {        m_pState = state;    }    //获得当前的状态    State* GetState()    {        return m_pState;    }    //改变当前的状态    void SetState(State *state)    {        m_pState = state;    }    //执行状态类实现的方法    void Request()    {        m_pState->Handle(this);    }    State* m_pState;};//具体的状态子类class ConcreteStateA:public State{public:    void Handle(Context *context);    void GetState();};//具体的状态子类class ConcreteStateB:public State{public:    void Handle(Context *context);    void GetState();};//具体的状态子类class ConcreteStateC:public State{public:    void Handle(Context *context);    void GetState();};
//cpp档案#include "StateMode.h"void ConcreteStateA:: Handle(Context *context){    context->m_pState = new ConcreteStateB;    cout<<"当前状态是A,下一状态是B"<<endl;}void ConcreteStateB:: Handle(Context *context){    context->m_pState = new ConcreteStateC;    cout<<"当前状态是B,下一状态是C"<<endl;}void ConcreteStateC:: Handle(Context *context){    context->m_pState = new ConcreteStateA;    cout<<"当前状态是C,下一状态是A"<<endl;}void ConcreteStateA:: GetState(){    cout<<"当前状态是A"<<endl;}void ConcreteStateB:: GetState(){    cout<<"当前状态是B"<<endl;}void ConcreteStateC:: GetState(){    cout<<"当前状态是B"<<endl;}
//main函式#include "StateMode.h"int main(void){    //初始化A状态    Context* context = new Context(new ConcreteStateA);    context->Request();    context->Request();    context->Request();    getchar();    return 0;}

相关推荐

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:yongganaa@126.com