策略和状态模式之间的简化差异

时间:2018-01-19 14:01:02

标签: design-patterns strategy-pattern

我正在学习模式,当我遇到州和初学者模式时我感到困惑。一个简单的谷歌搜索带我到这个stact overflow blog,这使得更加困惑。

我的简单问题是,

策略模式

public interface Istrategy {
        void algorithm();
    }
    public class add : Istrategy
    {
        public void algorithm()
        {
            Console.WriteLine("addition");
        }
    }
    public class multiply : Istrategy
    {
        public void algorithm()
        {
            Console.WriteLine("multiply");
        }
    }
    public class subtract : Istrategy
    {
        public void algorithm()
        {
            Console.WriteLine("subtract");
        }
    }
    public class context {
        public context(Istrategy strategy) {
            strategy.algorithm();
        }
    }
    public class client {
        static void Main() {
            new context(new add());

            Console.ReadLine();
        }
    }

州模式

public interface Istate {
        void algorithm();
    }
    public class add : Istate
    {
        public void algorithm()
        {
            Console.WriteLine("addition");
        }
    }
    public class multiply : Istate
    {
        public void algorithm()
        {
            Console.WriteLine("multiply");
        }
    }
    public class subtract : Istate
    {
        public void algorithm()
        {
            Console.WriteLine("subtract");
        }
    }
    public class context {
        Istate state;
        public context(Istate state) {
            state.algorithm();
        }
    }
    public class client {
        static void Main() {
            new context(new add());

            Console.ReadLine();
        }
    }

在上面的例子中,根据我的理解,我会把它作为,将一个对象传递给上下文而不保存任何状态是策略模式并且在上下文中保持状态是状态模式。

我的理解是对吗?

更新1

interface Istate
    {
        void action();
    }
    class walk : Istate
    {
        public void action()
        {
            Console.WriteLine("walking !!!");
        }
    }
    class run : Istate
    {
        public void action()
        {
            Console.WriteLine("running !!!");
        }
    }
    class fly : Istate
    {
        public void action()
        {
            Console.WriteLine("flying !!!");
        }
    }
    class context
    {
        Istate state;
        public void statePattern()
        {
            for (var i = 0; i < 3; i++)
            {
                if (i == 0)
                {
                    state = new walk();
                    state.action();
                }
                if (i == 1)
                {
                    state = new run();
                    state.action();
                }
                if (i == 2)
                {
                    state = new fly();
                    state.action();
                }
            }
        }
    }
    public class client
    {
        static void Main()
        {
            new context().statePattern();

            Console.ReadLine();
        }
    }

根据我的理解,这种方法是一种状态模式,还是一种策略模式下的方法?

interface Istate
    {
        void action();
    }
    class walk : Istate
    {
        public void action()
        {
            Console.WriteLine("walking !!!");
        }
    }
    class run : Istate
    {
        public void action()
        {
            Console.WriteLine("running !!!");
        }
    }
    class fly : Istate
    {
        public void action()
        {
            Console.WriteLine("flying !!!");
        }
    }
    class context
    {
        public void statePattern(Istate state)
        {
            state.action();
        }
        public void startegy()
        {
            for (var i = 0; i < 3; i++)
            {
                if (i == 0)
                {
                    statePattern(new walk());
                }
                if (i == 1)
                {
                    statePattern(new run());
                }
                if (i == 2)
                {
                    statePattern(new fly());
                }
            }
        }
    }
    public class client
    {
        static void Main()
        {
            new context().startegy();

            Console.ReadLine();
        }
    }

请告诉我,谢谢

1 个答案:

答案 0 :(得分:2)

这种技术差异没有错,但我认为你没有使用正确的方法来捕捉这两种模式之间的区别。

国家和战略被归类为行为设计模式 这将它们结合在一起,但从概念上讲,这些实际上是两个不同的东西。

在您的示例中,一般来说,选择算法类型是一种继续进行的方式,应该被视为一种策略。
试图将其转换为一种状态是没有意义的 状态模式允许对象在其内部状态改变时改变其行为 并且您的算法没有任何内部状态更改 这些是不同的策略。而且你证明了这一点,因为你永远不会从一个州转变为另一个州 试图理解具有相同用例的两种设计模式之间的差异,只能尝试将圆形放在正方形中,并且不能很好地理解。

如果您想真正留在算法域中,可以使用相关的用例 例如,在一系列算法中,您可以简单地使用它们(在您的问题中定义的那个),并且包含内部状态的更复杂,并根据此状态更改其行为。
状态模式可用于实现这些算法。

但你也可以依靠一个完全不同的例子来理解状态模式 这里是a question关于状态模式我回答的问题是洗衣机的建模,这是理解状态模式的一个很好的候选者。