zoukankan      html  css  js  c++  java
  • [C++设计模式] state 状态模式

    《head first 设计模式》中的样例非常不错,想制造一个自己主动交易的糖果机,糖果机有四个状态:投入钱不足,投入钱足够,出售糖果,糖果售罄。

    糖果机的当前状态处于当中不同的状态时,它针对同一个操作的反映动作也不同。

    传统面向过程编程会套用if-else对不同的状态下分别处理,逻辑麻烦并且不具有可拓展性。

    状态模式:同意一个对象在其内部状态改变时改变它的行为。对象看起来似乎改动了它的类。

    状态模式的重点在于状态转换,非常多时候。对于一个对象的状态,我们都是让这个对象包括一个状态的属性,这个状态属性记录着对象的详细状态,依据状态的不同使用分支结构来运行不同的功能。就像上面的代码那样处理。就像上面说的。类中存在大量的结构类似的分支语句,变得难以维护和理解。状态模式消除了分支语句。就像工厂模式消除了简单工厂模式的分支语句一样,将状态处理分散到各个状态子类中去。每一个子类集中处理一种状态,这样就使得状态的处理和转换清晰明白


    State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。
    ConcreteState类,详细状态,每个子类实现一个与Context的一个状态相关的行为。
    Context类,维护一个ConcreteState子类的实例。这个实例定义当前的状态。


    给出框架。不再实现,比較好理解。

    class Context;
    class State
    {
    public:
        virtual void Handle(Context* pContext)=0;
        ~State();
    protected:
        State();
    private:
    };
    
    class ConcreteStateA : public State
    {
    public:
        ConcreteStateA();
        ~ConcreteStateA();
        virtual void Handle(Context* pContext);
    protected:
    private:
    };
    
    class ConcreteStateB : public State
    {
    public:
        ConcreteStateB();
        ~ConcreteStateB();
        virtual void Handle(Context* pContext);
    protected:
    private:
    };
    
    class ConcreteStateC : public State
    {
    public:
        ConcreteStateC();
        ~ConcreteStateC();
        virtual void Handle(Context* pContext);
    protected:
    private:
    };
    
    class Context
    {
    public:
        Context(State* pState);
        ~Context();
        void Request();
        void ChangeState(State* pState);
    protected:
    private:
        State* _state;
    };
    
    

  • 相关阅读:
    Ubuntu包管理命令 dpkg、apt和aptitude
    Linux curses库使用
    VC皮肤库SkinSharp 1.0.6.6的使用
    HOG(方向梯度直方图)
    2014年国外发布的中国内地大学排名18强名单
    sql语句中BEGIN TRAN...COMMIT TRAN
    搜索框中“请输入搜索keyword”
    IOS基于新浪微博开放平台微博APP
    php字符串标点等字符截取不乱吗 封装方法
    谈一谈struts2和springmvc的拦截器
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7239785.html
Copyright © 2011-2022 走看看