| 1.意图:
允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.
2.适用性:
--一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
--一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态.这个状态通常用一个或多个的枚举常量表示.
3.参与者:
--Context 定义客户感兴趣的接口,维护一个ConcreteState子类的实例,这个实例定义当前的状态
--State 定义一个接口以封装与Context的一个特定状态相关的行为
--ConcreteState 每一子类实现一个与Context的一个状态相关的行为
4.代码示例
class State
{
public:
virtual void Handle()=0;
};
class ConcreteState1:public State
{
public:
void Handle(){cout<<"execute ConcreteState1->Handle"<<endl;}
};
class ConcreteState2:public State
{
public:
void Handle(){cout<<"execute ConcreteState2->Handle"<<endl;}
};
class Context
{
private:
State *currentState;
public:
static final int STATEONE=1;
static final int STATETWO=2;
Context(){currentState=new ConcreteState1;} //默认state是concreteState1
void Request(){currentState->Handle();}
void ChangeState(int s)
{
delete currentState; //防止内存泄漏
switch(s):
case(STATEONE):
currentState=new ConcreteState1;
break;
case(STATETWO):
currentState=new ConcreteState2; break;
default:
currentState=new ConcreteState1; //还是状态1默认
}
};
客户使用该模式
Context *c=new Context;
c->Request();
c->ChangeState(Context::STATETWO);
c->Request();
结果为:
execute ConcreteState1->Handle
execute ConcreteState2->Handle 南瓜皮皮@2007-3-6 15:52:00 |