​设计模式之策略模式

​设计模式之--策略模式

1,定义:策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2,“策略”理解:一个策略就是一个计划,通过执行计划,我们在既定的输入下给出特定的输出。一般情况下,为了获得这个输出,使用策略比使用算法要有更为广阔的选择空间。因此,策略通常可以表达为一组方案,这些方案之间可以进行互相替换(也可以理解为一组算法)。

        使用策略模式可以把相互之间能够替换的策略封装在某些类的内部,这些类通常是互相分离的,每个类都会实现一个同策略类独立完成。这些显现了不同策略的类在本质上都是实现了同一个操作,所以他们之间可以进行互相转换,正式由于这种相互替换的特点使得程序可以给用户的不同输入提供不同的策略。

3,适用情况:

    1),很多相关的类知识在行为上有差异;

    2),当需要使用一个算法的不同变体时;

    3),使用算法的客户不应该知道算法的具体结构时;

    4),当一个类定义了多种行为并且这些行为在这个类的操作中可以多个条件语句的形式出现时。

4,代码:

        主类:Main.class

        public class Main {

           public static void main(String[] args) {

             Context context;

             context = new Context(1);

             context.GetDecision();

             context = new Context(2);

             context.GetDecision();

             context = new Context(3);

             context.GetDecision();

           }

        }

        上下文类:Context.class

    ​    ​public class Context {

    ​    ​   Strategy strategy;

    ​    ​   public Context(int i) {

    ​    ​     switch (i) {

    ​    ​       case 1:

    ​    ​         strategy = new ConcreteStrategyA();

    ​    ​         break;

    ​    ​       case 2:

    ​    ​         strategy = new ConcreteStrategyB();

    ​    ​         break;

    ​    ​       case 3:

    ​    ​         strategy = new ConcreteStrategyC();

    ​    ​         break;

    ​    ​       default:

    ​    ​         break;

    ​    ​     }

    ​    ​   }

    ​    ​

    ​    ​   public void GetDecision(){

    ​    ​     strategy.Algorithm();

    ​    ​   }

    ​    ​}

    ​    ​抽象的策略类代码:Strategy.class:

    ​    ​public abstract class Strategy {

    ​    ​   public abstract void Algorithm();

    ​    ​}

    ​    ​策略类A:ConcreteStrategyA.class:

    ​    ​public class ConcreteStrategyA extends Strategy{

    ​    ​   @Override

    ​    ​   public void Algorithm() {

    ​    ​     System.out.println("策略A");

    ​    ​   }

    ​    ​}

    ​    ​策略类B:ConcreteStrategyB.class:

    ​    ​public class ConcreteStrategyB extends Strategy{

    ​    ​        @Override

    ​    ​        public void Algorithm() {

    ​    ​           System.out.println("策略B");

    ​    ​        }

    ​    ​}

    ​    ​

        策略类C:ConcreteStrategyC.class:

        public class ConcreteStrategyC extends Strategy{

                @Override

                public void Algorithm() {

                   System.out.println("策略C");

                }

        }

运行结果:

    ​    ​策略A

    ​    ​策略B

    ​    ​策略C

posted @ 2015-08-12 16:11  依凡王子  阅读(171)  评论(0编辑  收藏  举报