首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用图数据结构实现状态模式

用图数据结构实现状态模式
EN

Stack Overflow用户
提问于 2016-08-15 05:36:33
回答 1查看 78关注 0票数 0

我目前正在尝试实现一个大约有10个状态的应用程序。与传统的状态模式不同,从一个状态到另一个状态只有一个链接,我希望它更像一个有向图,其中一个状态可以有多个边到不同的状态。

例如:我有状态1-10 (顶点)。-是边。这些可以是可能的状态转换。

1-2,1-3,1-6 2-3,2-9 3-5 4-3 5-2,5-3,5-4 6-3,6-4,6-7,6-9 ...诸若此类

每个状态都是类,每个边( -)都是方法。例如:

Class State1 { public void goToState2() ; public void goToState3() ; public void goToState6() ; }

Class State2 { public void goToState3() ; public void goToState9() ; } ...

我可以想到反射和一堆switch语句来解决这个问题,但我认为我也可以应用状态模式,或者在这里提出一个更优雅的解决方案,但我绝对被卡住了。

任何帮助或指导都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2020-03-25 16:02:50

由于涉及到状态转换图,因此需要维护邻接关系并定义转换标准。这个标准可以是所有节点通用的(例如,从一个节点到另一个节点的转换是由转换成本决定的),也可以针对每个节点进行自定义(例如,在某些节点上,转换是基于成本进行的,而对于其他节点,转换是基于节点类型进行的)。

代码语言:javascript
复制
class ExecutionParameters;
class IState;
using SPState = std::shared_ptr<IState>;
using SPStates = std::list<SPState>;
class _declspec(novtable) IState
{
public:
    virtual void Execute(Context& context, const ExecutionParameters& params) = 0;
    virtual SPStates GetAdjacentStates() const noexcept = 0;
};

class _declspec(novtable) ITransitionCriteria
{
public:
    virtual SPState ComputeNextState() const = 0;
};

class CostBasedTransition : public ITransitionCriteria
{
public:
    SPState ComputeNextState() const override
    {
         // Find min transition cost adjacent node
    }
};
using SPTransitionCriteria = std::shared_ptr<ITransitionCriteria>;

class StateNode : public IState
{
public:
    StateNode(int id, SPTransitionCriteria spTransitionCriteria) :m_id(id), m_spTransitionCriteria(spTransitionCriteria)
    {}
    StateNode(int id) :StateNode(id, nullptr)//Choose default transition criteria//)
    {}

    void Execute(Context& context, const ExecutionParameters& params) override
    {
        // Perform action

        // Update context state
        context.SetState(m_spTransitionCriteria->GetNextState());
    }

    SPStates GetAdjacentStates() const noexcept
    {
        return m_spAdjacentStates;
    }

    void AddAjacentState(SPState spState)
    {
    }

    void RemoveAjacentState(int stateId)
    {
    }
private:
    int m_id;
    SPStates m_spAdjacentStates;
    SPTransitionCriteria m_spTransitionCriteria;
};

class Context
{
public:
    void Execute(const ExecutionParameters& params)
    {
        m_spState->Execute(*this, params);
    }

    void SetState(SPState& spState)
    {
        m_spState = spState;
    }
private:
    SPState m_spState;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38946840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档