设计模式--策略模式

时间:2019-11-18
本文章向大家介绍设计模式--策略模式,主要包括设计模式--策略模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

设计模式--策略模式

1、策略模式

  策略模式:定义一些列算法,把它们一个个的封装起来,并且使它们可以相互替换,该模式可以使得算法独立于使用它的客户而变化。

2、策略模式的结构

  • 角色

    • 策略:策略是一个接口,该接口定义了若干算法,也即是若干的抽象方法;

    • 上下文:上下文是依赖于策略接口的类,即上下文包含策略声明的变量,上下提供一个方法,该方法委托策略变量调用具体策略所

    • 具体策略:具体策略是实现策略接口的类,它需要实现策略接口中定义的抽象方法。

  • 类图

3、策略模式举例

策略接口:Strategy.java

package com.nick.pattern.strategy;
/**
 * 抽象策略接口:定义若干抽象方法
 * @author nick
 */
public interface Strategy {
   public abstract void algorithm();
}

上下文:Context.java

package com.nick.pattern.strategy;
/**
 * 上下文类
 * @author nick
 */
public class Context {
    Strategy strategy;  //定义策略变量
    public void setStrategy(Strategy strategy){
        this.strategy=strategy;     //设置策略
    }
    void lookAlgorithm(){    //定义的一个方法
        strategy.algorithm();      //在方法中委托策略变量调用策略接口中的抽象方法
    }
}

具体策略A: StrategyA.java

package com.nick.pattern.strategy;
/**
 * 具体策略类A(实现策略接口)
 * @author nick
 */
public class StrategyA implements Strategy{
    @Override
    public void algorithm() {
        System.out.println("调用算法A");
    }
}

具体策略B: StrategyB.java

package com.nick.pattern.strategy;
/**
 * 具体策略类B
 * @author  nick
 */public class StrategyB implements Strategy {
    @Override
    public void algorithm() {
        System.out.println("调用算法B");
    }
}

主程序

package com.nick.pattern.strategy;
/**
 * 主程序
 * @author  nick
 */
public class Application {
    public static void main(String[] args) {
        Context context = new Context();        //定义上下文对象
        context.setStrategy(new StrategyA());   //给上下文对象设置策略算法A
        context.lookAlgorithm();                //在该算法下进行计算
        context.setStrategy(new StrategyB());   //给上下文对象设置策略算法B
        context.lookAlgorithm();                //在算法B下进行计算
    }
}

运行结果:

   

4、策略模式的优缺点

  • 优点1:上下文和具体策略是松耦合的关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要关心是哪个类在实现。

  • 优点2:策略模式满足“开-闭”原则。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。 

原文地址:https://www.cnblogs.com/sinlearn/p/11881452.html