【问题标题】:State machine with interface-separated states具有接口分离状态的状态机
【发布时间】:2022-11-17 18:46:43
【问题描述】:

在经典版本的状态中,每个状态都实现了一些接口。所以我们可以将执行传递给任何当前状态

class Context
{
    private State _state;

    public void MethodA()
    {
        _state.MethodA();
    }

    public void MethodB()
    {
        _state.MethodB();
    }
}

但就我而言。我有一个游戏功能。它提供了可以购买的东西。它也有状态,如“活动”、“购买”、“准备”、“完成”等。他们中的一些人允许购买,而其他人则不允许。 以更抽象的方式——每个状态只实现上下文接口方法的一部分。和方法可能相交

class ConcreteStateA
{
    public void MethodA()
    {
        // Do A
    }

    // No MethodB
}

class ConcreteStateB
{
    // No MethodA

    public void MethodB()
    {
        // Do B
    }
}

问题:以这种方式使用状态机是否有任何修改?当前的变化导致在调用上下文之前直接检查它是否是正确的状态。状态类层次结构不能避免状态类型检查的问题

【问题讨论】:

标签: c# unity3d design-patterns state state-machine


【解决方案1】:

您可以添加一个接口,该接口具有名为“Handle”的方法。 然后您可以在您的具体类中实现该接口。 通过这种方法,您可以只说从该状态下一步要做什么,而不必强制执行其他状态。

看到这个: https://www.dotnettricks.com/learn/designpatterns/state-design-pattern-c-sharp

【讨论】:

  • 是的,这可能是一种方式,但是......通常这些方法是具体的 - 不同的参数,它们也通过 API 调用并执行具体的逻辑。所以 - 上下文应该执行 2 种以上的方法,但它们中的每一种都允许在不同的状态下使用。在某种程度上,状态是对操作是否允许的验证
  • 还有另一种实现方式。您可以添加“NextState”和“PreviousState”。然后你可以决定去下一步......或者你可以在不满足某些逻辑时返回到另一个先前的状态。
【解决方案2】:

我真的很喜欢维基中使用的状态模式的定义:

状态模式是一种行为软件设计模式,它允许一个对象在其内部状态改变时改变它的行为。这种模式接近于有限状态机的概念.状态模式可以解释为策略模式,它能够通过调用模式接口中定义的方法来切换策略。

注意这句话:

允许一个对象在其内部状态改变时改变它的行为。这种模式接近于有限状态机的概念

上面这句话的意思是所有的方法都是必须的,要处理得当。我非常喜欢这本书“Head First Design Patterns”。这本书展示了如何处理不同的状态。

根据您的状态,我得出的结论是您正在开发某种自动售货机。让它成为咖啡自动贩卖机 机器。假设我们在咖啡自动售货机中只有一种方法PutMoney()

所以这是我们对状态的抽象:

public interface IState
{
    void PutMoney();
}

它是ActiveState的具体实现:

public class ActiveState : IState
{
    public void PutMoney()
    {
        Console.WriteLine("Please, 15 cents to get a cup of coffee!:)");
    }
}

它是BuyingState的具体实现:

public class BuyingState : IState
{
    public void PutMoney()
    {
        Console.WriteLine("You have already put money. 
            Just choose desireed coffee!:)");
    }
}

它是PreparingState的具体实现:

public class PreparingState : IState
{
    public void PutMoney()
    {
        Console.WriteLine("You have already chosen money. 
            We are preparing coffee for you!:)");
    }
}

它是FinishedState的具体实现:

public class FinishedState : IState
{
    public void PutMoney()
    {
        Console.WriteLine("You have already bought coffeey. 
            No money is necessary! Just take coffee:)");
    }
}

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多