设计模式 状态行为模式复杂应用底层设计

头文件

#pragma once
#ifndef __OBJ
#define __OBJ

#include "LBuff.h"
#include "LSocket.h"
#include "LRunnable.h"
#include "LMsg.h"

class Object
{
public:
    Object() {}
    virtual ~Object() {}
};

class Event
{
public:
    enum SYSEVENTTYPE
    {
        LS_2_LM_EVENT,
        LM_2_LS_EVENT,
        CLIENT_2_LM_EVENT,
        CLIENT_2_LS_EVENT,
        TICK_TIME_LM_EVENT,
        TICK_TIME_LC_EVENT
    };


    Lint m_iEventType;
    std::vector<Object*> m_arvgList;

public:
    void PushState(Object* _state)
    {
        if (_state != NULL)
            m_OptStack.push_back(_state);
        else
            LLOG_ERROR(">>>>  PushState(Object* _state): _state is NULL");
    }

    Object* PopState()
    {
        Object* obj = m_OptStack.back();
        m_OptStack.pop_back();
        return obj;
    }
private:
    std::vector<Object*> m_OptStack;
};

class BaseAction: public Object
{
public:
    BaseAction() {};
    virtual Lint ActionInit(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) = 0;
    virtual Lint ActionDoing(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) = 0;
    virtual bool isFinish(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) = 0;
};

enum enu_SERVER_TYPE
{
    LM_SERVER=1,
    LS_SERVER
};

class State: public Object
{
public:
    enum enu_STATE
    {
        STATE_INIT_PREPARE=1,
        STATE_INIT,
        STATE_INIT_FINISH,
        STATE_PROC,
        STATE_OVER_PREPARE,
        STATE_OVER,
        STATE_OVER_RELEASE,
        STATE_END
    };
public:
    static  Lint m_ServerType;

    virtual Lint StateInit() = 0;
    virtual Lint StateProc(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) = 0;
    virtual Lint StateOver() = 0;
};
//--------------------------------------------
class BaseState: public State
{
protected:
    Lstring                            m_stateName;
    BaseAction*                        m_Action;
    Lint                                m_iState;
    std::map<Lint, BaseAction*>        m_RegActionList;
    bool                                m_isActionFinish;
    Lint Doing(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn);
public:
    BaseState() { m_iState = 0; m_Action = NULL; };
    Lint GetState() { return m_iState; }//获取当前状态
    Lint SetState(Lint _state);         //强制设置 当前状态,慎用,有可能有未处理完成的状态。

    //当前状态事件处理    
    virtual bool IsStateFinish() { if (m_iState == m_RegActionList.size()) return true; return false; };

    // 通过 BaseState 继承, 初始化 注册动作列表
    virtual Lint StateInit() =0;

    virtual Lint StateProc(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) override;
    // 释放动作列表
    virtual Lint StateOver() =0;
    
protected:
    BaseAction* CreateAction() { return m_RegActionList[m_iState]; };
    
public:
    virtual void DestroyState() { m_Action = NULL; m_isActionFinish = false; };
};

class BaseStateState : public BaseState
{
protected:

    std::map<Lint, BaseState*> m_listSubState;
    Lint    m_StateIndex;
    bool    m_isMyFinish;
public:
    BaseStateState() { m_iState = 0; m_Action = NULL; m_StateIndex = 0; };
    Lint GetState() { return m_iState; }//获取当前状态
    Lint SetState(Lint _state) { return 0; };         //强制设置 当前状态,慎用,有可能有未处理完成的状态。

    //当前状态事件处理    
    virtual bool IsStateFinish() { if (m_iState == m_listSubState.size()) return true; return false; };

    // 通过 BaseState 继承, 初始化 注册动作列表
    virtual Lint StateInit() = 0;

    virtual Lint StateProc(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) override;
    // 释放动作列表
    virtual Lint StateOver() = 0;

public:    
    virtual void DestroyState();    
};
//------------------------------------------------------------------
 

 

实现文件


Lint BaseState::Doing(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn) {
    Lint ret = -1;
    if (m_Action != NULL)//已分配 事情要做
    {            
        ret = m_Action->ActionDoing(_obj, _obj2, _obj3, _objdata, _msg);//处理事情
        if (m_Action->isFinish(_obj, _obj2, _obj3, _objdata, _msg))// 是否满足结束条件
        {
            m_iState++;
            DestroyState();//摧毁action
            if (m_iState < m_RegActionList.size())
            {
                m_Action = CreateAction();
                if (m_Action)
                ret = m_Action->ActionInit(_obj, _obj2, _obj3, _objdata, _msg);//初始化
            }
        }
    }
    else // 没有分配事情做
    {
        while (m_Action == NULL && m_iState < m_RegActionList.size())//找需要做的事情,找到并创建成功
        {            
            m_Action = CreateAction();
            if (m_Action)// 是否创建成功
            {                
                ret = m_Action->ActionDoing(_obj, _obj2, _obj3, _objdata, _msg);//处理事情
                if (m_Action->isFinish(_obj, _obj2, _obj3, _objdata, _msg))// 是否满足结束条件
                {
                    m_iState++;
                    DestroyState();//摧毁action
                    if (m_iState < m_RegActionList.size())
                    {
                        m_Action = CreateAction();
                        if(m_Action)
                        ret = m_Action->ActionInit(_obj, _obj2, _obj3, _objdata, _msg);//初始化
                    }
                }
                break;
            }
        }
    }
        
    return ret;
}

Lint BaseState::SetState(Lint _state)
{
    m_iState = _state;
    DestroyState();
    m_Action = CreateAction();
    return m_iState;
}


Lint BaseState::StateProc(Object* _obj, Object* _obj2, Object* _obj3, Object* _objdata, LMsg* _msg, Event& _evn)
{//当前状态 ,当收到 需要处理的数据时, 调用该函数。
    return  BaseState::Doing(_obj, _obj2, _obj3,_objdata, _msg);
}

Lint BaseStateState::StateProc(Object * _obj, Object * _obj2, Object * _obj3, Object * _objdata, LMsg * _msg, Event & _evn)
{
    if (m_isMyFinish == true)
        return 0;


    while (m_listSubState[m_StateIndex]->IsStateFinish())
    {
        m_StateIndex++;
        if (m_StateIndex > m_listSubState.size() || m_listSubState[m_StateIndex] == NULL)
            break;
    }
    if (m_listSubState[m_StateIndex] != NULL)
    {
        if (!(m_listSubState[m_StateIndex]->IsStateFinish()))
        {
            _evn.PushState(this);
            m_listSubState[m_StateIndex]->StateProc(_obj, _obj2, _obj3, _objdata, _msg, _evn);
            _evn.PopState();

        }
        else
        {
            m_StateIndex++;
            if (m_StateIndex > m_listSubState.size())
            {                
                m_isMyFinish = true;
                Lint i = 0;
                while (i <= m_listSubState.size())
                {
                    m_listSubState[i++]->DestroyState();
                }
            }
        }
    }

    return Lint();
}

void BaseStateState::DestroyState()
{
    m_isActionFinish = false;
    m_StateIndex = 0;
    Lint i = 0;
    while (i <= m_listSubState.size())
    {
        m_listSubState[i++]->DestroyState();
    }
};
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值