zoukankan      html  css  js  c++  java
  • 大话设计模式--状态模式 State -- C++实现实例

    1.状态模式: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来就像是改变了其类。

    状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂, 把状态的判断逻辑转移到表示不同状态的一系列类当中,

    可以把复杂的判断逻辑简化。

    状态模式通过把各种状态转移逻辑分布到State的子类之间,减少相互之间的依赖。

    当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。

    实例::

    context.h context.cpp

    #ifndef CONTEXT_H
    #define CONTEXT_H
    
    class State;
    
    class Context
    {
    public:
        Context(State *state);
        void request();
        State *state;
    
    };
    
    #endif // CONTEXT_H
    #include "context.h"
    #include "state.h"
    
    Context::Context(State *state)
    {
        this->state = state;
    }
    
    void Context::request()
    {
    
        state->handle(this);
    }

    state.h state.cpp

    #ifndef STATE_H
    #define STATE_H
    
    class Context;
    
    class State
    {
    public:
        State();
        void virtual handle(Context *context);
    };
    
    #endif // STATE_H
    #include "state.h"
    #include "context.h"
    
    State::State()
    {
    }
    
    void State::handle(Context *context)
    {
    
    }

    statea.h statea.cpp

    #ifndef STATEA_H
    #define STATEA_H
    
    #include "state.h"
    #include "context.h"
    #include "stateb.h"
    
    class StateA : public State
    {
    public:
        StateA();
        void handle(Context *context);
    };
    
    #endif // STATEA_H
    #include "statea.h"
    #include "state.h"
    #include "context.h"
    #include "stateb.h"
    #include <stdio.h>
    
    StateA::StateA()
    {
    }
    
    void StateA::handle(Context *context)
    {
        printf("on StateA
    ");
        context->state = new StateB();
    }


    stateb.h stateb.cpp

    #ifndef STATEB_H
    #define STATEB_H
    
    #include "statea.h"
    #include "context.h"
    
    class StateB : public State
    {
    public:
        StateB();
        void handle(Context *context);
    };
    
    #endif // STATEB_H
    #include "stateb.h"
    #include "statea.h"
    #include "context.h"
    #include <stdio.h>
    
    StateB::StateB()
    {
    }
    
    void StateB::handle(Context *context)
    {
        printf("on StateB
    ");
        context->state = new StateA();
    }

    main.cpp  可以状态AB之间相互切换,而只需要一个方法request

    #include <iostream>
    #include "context.h"
    #include "statea.h"
    #include "stateb.h"
    
    using namespace std;
    
    int main()
    {
        cout << "State test!" << endl;
    
        Context *c = new Context(new StateA);
        c->request();
        c->request();
        c->request();
    
        return 0;
    }


     








     

  • 相关阅读:
    .Net魔法堂:史上最全的ActiveX开发教程——发布篇
    .Net魔法堂:史上最全的ActiveX开发教程——开发篇
    JS魔法堂:浏览器模式和文档模式怎么玩?
    JS魔法堂:精确判断IE的文档模式by特征嗅探
    JS魔法堂:追忆那些原始的选择器
    意译:自调用函数表达式
    一起Polyfill系列:让Date识别ISO 8601日期时间格式
    一起Polyfill系列:Function.prototype.bind的四个阶段
    poco 线程库
    CDN理解<转>
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648185.html
Copyright © 2011-2022 走看看