zoukankan      html  css  js  c++  java
  • 策略模式 OK

      策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。

      策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。事实上你可以将一个继承自抽象策略类的称为具体策略,就是策略模式中的策略1,策略2......

      策略模式的优点:

      策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法的公共功能。策略模式的另一个优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

      说了这么多,策略模式究竟解决的是什么问题呢?

      策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

      在基本策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。

      策略模式的结构图:

          

      策略模式的具体实现代码示例:

    namespace 策略模式
    {
        public class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("我钓了一条鱼,应该怎么煮呢?");
    
                Context context;
                context = new Context(new ConcreteStrategyA());  //客户端依赖具体实现类了
                context.RunMethod();
    
                context = new Context(new ConcreteStrategyB());
                context.RunMethod();
    
                Console.ReadKey();
            }
        }
    
        //抽象算法类
        public abstract class Strategy
        {
            //算法方法
            public abstract void AlgorithmInterface();
        }
    
        //具体策略1
        public class ConcreteStrategyA : Strategy
        {
            public override void AlgorithmInterface()
            {
                Console.WriteLine("加水、上蒸笼、开火、清蒸!");
            }
        }
    
        //具体策略2
        public class ConcreteStrategyB : Strategy
        {
            public override void AlgorithmInterface()
            {
                Console.WriteLine("热锅、放油、红烧!");
            }
        }
    
        //上下文
        public class Context
        {
            Strategy strategy;
    
            //构造方法接收具体对象
            public Context(Strategy strategy)
            {
                this.strategy = strategy;
            }
    
            //调用方法
            public void RunMethod()
            {
                strategy.AlgorithmInterface();
            }
        }
    }

      以上代码感觉到了什么?策略模式不管创建,它做的事非常少,少到什么程度?

      你传个对象给我,我帮你调用这个对象的方法(这个工作主要通过Context来维护),我不管你这对象怎么创建,但你得给我个对象。策略模式不管对象的创建,那么它实质上是什么。用类图说明。

      

      从上面的类图看到一个问题。因为,我调用你时,我要给你传个对象,上面的例子直接new()。因此,客户端依赖于具体实现类了。

      所以,策略模式通常与一些创建对象的模式混合使用,比如负责维护调用具体策略的Context类搭配个简单工厂:

        public class Context
        {
            Strategy strategy = null;
            //调用方法
            public void RunMethod(string type)
            {
                
                switch (type)
                {
                    default:
                    case "清蒸":
                        strategy = new ConcreteStrategyA();
                        break;
                    case "红烧":
                        strategy = new ConcreteStrategyB();
                        break;
                }
                strategy.AlgorithmInterface();
            }
        }

      这样外部就依赖Context类了:

            static void Main(string[] args)
            {
                Console.WriteLine("我钓了一条鱼,应该怎么煮呢?");
    
                Context context = new Context();
                context.RunMethod("清蒸");
                context.RunMethod("红烧");
    
                Console.ReadKey();
            }

      最后回顾一下:

      策略模式不管对象创建,它的目的在于封装不同的算法,根据传入的对象,调用具体的策略方法,在上面的示例程序加入简单工厂模式的原因,是因为要创建对应的具体类,要分清哪些代码属于哪个模式的范畴。

      搞了半天,策略模式就是一个类封装一个算法,实现一个算法接口,然后搞个Context来调用这些算法。

  • 相关阅读:
    Unable To Open Database After ASM Upgrade From Release 11.1 To Release 11.2
    11g Understanding Automatic Diagnostic Repository.
    How to perform Rolling UpgradeDowngrade in 11g ASM
    Oracle 11.2.0.2 Patch 说明
    Pattern Matching Metacharacters For asm_diskstring
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    Upgrading ASM instance from Oracle 10.1 to Oracle 10.2. (Single Instance)
    OCSSD.BIN Process is Running in a NonRAC Environment
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    On RAC, expdp Removes the Service Name [ID 1269319.1]
  • 原文地址:https://www.cnblogs.com/kissdodog/p/2962310.html
Copyright © 2011-2022 走看看