您的位置:首页 > 编程语言 > C语言/C++

设计模式--状态模式C++实现

2016-04-09 00:00 417 查看

1定义

当一个状态的内在状态改变时允许其行为改变,这个对象看起来像改变了其类

2类图



角色分析

State抽象状态角色,接口或者抽象类,负责状态定义,并且封装环境角色以实现状态切换

ConcreteState具体状态角色,完成两个职责:本状态行为管理以及趋向状态处理--==本状态要做的事和本状态如何过度到其他状态

Context环境角色,定义客户端需要的接口,并且负责具体状态的切换

实现

#include<iostream>
usingnamespacestd;

//前项声明
classContext;
//抽象状态类定义
classState
{
protected:
State(){}
public:
virtual~State()=0
{};
voidsetContext(Context*x)
{
_context=x;
}
virtualvoidhandler1()=0;
virtualvoidhandler2()=0;
private:
Context*_context;
};

//具体状态定义
classConcreteState1:publicState
{
public:
ConcreteState1(){}
~ConcreteState1(){}

voidhandler1()
{
cout<<"ConcreteState1::handler1"<<endl;
}
voidhandler2()
{
cout<<"ConcreteState1::handler2"<<endl;
}
private:

};

//具体状态定义
classConcreteState2:publicState
{
public:
ConcreteState2(){}
~ConcreteState2(){}

voidhandler1()
{
cout<<"ConcreteState2::handler1"<<endl;
}
voidhandler2()
{
cout<<"ConcreteState2::handler2"<<endl;
}
private:

};

//环境类
classContext
{
public:
Context()
:Sta1(newConcreteState1)
,Sta2(newConcreteState2)
{}
State*getCurrentState()
{
returnCurrentState;
}
voidSetCurrentState(State*s)
{
CurrentState=s;
CurrentState->setContext(this);
}
voidhandler1()
{
CurrentState->handler1();
}
voidhandler2()
{
CurrentState->handler2();
}
~Context(){}
private:
//当前状态则是所有状态中的一种
State*CurrentState;
//所有状态应当定义为static比较合适
State*Sta1;
State*Sta2;
};


voidTestState()
{
Context*context=newContext();
context->SetCurrentState(newConcreteState1());

context->handler1();
context->handler2();
context->SetCurrentState(newConcreteState2());
context->handler1();
context->handler2();
}






3应用

①优点

状态模式隐藏了状态的变化过程,他的切换引起了行为的变化。我们只看到行为变化,而没有状态变化

结构清晰,避免过多switch或者if语句的使用

体现开闭原则和单一职责原则,每个状态都是一个子类

封装性良好,状态变化在内部体现,外界调用不知道这一点

②缺点

子类越多会带来类膨胀的问题

4使用场景

行为随着状态改变而改变

条件分之判断语句的替代者

5注意事项

状态模式适用于当某个对象在他的状态发生变化时,他的行为也随之变化,也就是行为受状态约束的情况下使用状态模式,而且使用对象时状态不超过5个

6最佳实践

TCP三个状态切换:等待状态,连接状态,断开状态。

工作流开发:状态机管理。

{
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: