BLog 公 告

过平淡的生活,真诚待人,坦然然后继续努力做好自己!

BLog 统 计
  • 日志:86
  • 评论:12
  • 留言:0
  • 访问:
最 新 文 章
最 新 回 复
最 新 留 言
用 户 登 陆
友情连接

 
 
 
  设计模式之State

 
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
 
   
发表评论:
数据载入中...
 
© COPYRIGHT 2005 ALL RIGHTS RESERVED tiana0525的blog