zoukankan      html  css  js  c++  java
  • 设计模式之十二:状态模式(State)

    状态模式:
    当一个对象的内部状态发生变化时同意改变它的行为。

    Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

    状态模式将依赖于状态的行为分离成了各种状态类,每一种特定的转态类仅仅处理单一的行为。而且定义了各种状态之间的转移变迁关系。

    UML图:

    这里写图片描写叙述

    主要包括:

    1. Context:定义了client须要的接口,操作了一个当前状态类的引用
    2. State:抽象的状态类。为继承的类定义了一个依赖于当前状态的接口。
    3. ConcreteState:详细的状态类,每个子类都实现了特性状态相关的行为。

    C++代码例如以下:

    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    
    class Context;
    
    class State{
            public:
                    virtual void handle(Context * c)=0;
    };
    
    class Context
    {
            public:
                    void setState(State * s)
                    {
                        state=s;
                    }
                    void request()
                    {
                        state->handle(this);
                    }
    
            private:
                    State * state;
    };
    
    class ConcreteStateA:public State
    {
        public:
                void handle(Context * c);
    };
    
    //注意这里ConcreteStateA和ConcreteStateB之间相互包括。所以须要将handle方法写在类外面。
    class ConcreteStateB:public State
    {
        public:
                void handle(Context * c);
    };
    
    void ConcreteStateA::handle(Context * c)
    {
                    std::cout<<"do something dependended on concreteStateA"<<std::endl;
                    c->setState(new ConcreteStateB());
    }
    
    
    void ConcreteStateB::handle(Context * c)
    {
                    std::cout<<"do something dependended on concreteStateB"<<std::endl;
                    c->setState(new ConcreteStateA());
    }
    
    int main()
    {
        Context * c=new Context();
        State * sA=new ConcreteStateA();
        c->setState(sA);
    
        c->request();
        c->request();
        c->request();
    
        return 0;
    }
    

    运行结果例如以下:

    这里写图片描写叙述

    详细使用时能够在Context中添加一个成员变量。依据这个成员变量的值在详细的State类之间推断转移关系。

  • 相关阅读:
    jQuery中的DOM操作
    jQuery选择器
    面试问题总结
    oracle日期操作
    Oracle报错:ORA-02064: distributed operation not supported
    JDK源码-String
    JDK源码-HashSet
    JDK源码-TreeMap
    JDK源码-Vector
    AJAX验证用户是否存在
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5142912.html
Copyright © 2011-2022 走看看