zoukankan      html  css  js  c++  java
  • 设计模式22:Strategy 策略模式(行为型模式)

    Strategy 策略模式(行为型模式)

    动机(Motivation)

    在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

    如何在运行时根据需要透明地更改算法?将算法与对象本身解耦,从而避免上述问题?

    意图(Intent)

    定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。该模式使得算法可以独立于使用它的客户而变化。——《设计模式》GoF

    示例代码

        enum CartType
        {
            A, B, C
        }
        class Cart
        {
            public void Process(CartType cartType)
            {
                if (cartType == CartType.A)
                {
                    ProcessorA();
                }
                else if (cartType == CartType.B)
                {
                    ProcessorB();
                }
                else if (cartType == CartType.C)
                {
                    ProcessorC();
                }
            }
    
            private void ProcessorA()
            {
                //...
            }
            private void ProcessorB()
            {
                //...
            }
            private void ProcessorC()
            {
                //...
            }
        }

     使用策略模式后的代码:

        public interface IProcessStrategy//表达算法抽象
        {
            void Process();
        }
    
        public class ProcessStragegyA : IProcessStrategy
        {
            public void Process()
            {
                //...
            }
        }
        public class ProcessStragegyB : IProcessStrategy
        {
            public void Process()
            {
                //...
            }
        }
        public class ProcessStragegyC : IProcessStrategy
        {
            public void Process()
            {
                //...
            }
        }
    
        class Cart
        {
            private IProcessStrategy processStrategy;
    
            public Cart(IProcessStrategy processStrategy)
            {
                this.processStrategy = processStrategy;
            }
    
            public void Somemethod1()
            {
                //...
                processStrategy.Process();
                //...
            }
    
            public void Somemethod2()
            {
                //...
                processStrategy.Process();
                //...
            }
        }

    客户端调用:

            static void Main(string[] args)
            {
                Cart cart=new Cart(new ProcessStragegyA());//这里可以通过配置来动态调用
                cart.Somemethod1();
            }

    结构(Structure)

    Strategy模式的几个要点

    • Strategy及其子类为组件提供了一系列的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法,支持算法的变化。
    • Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
    • 与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省开销。

    转载请注明出处:

    作者:JesseLZJ
    出处:http://jesselzj.cnblogs.com

  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4775723.html
Copyright © 2011-2022 走看看