什么是策略设计模式:它定义了算法家族,分别封装起来,让他们之间可以项目替换,此模式让算法的变化,不会影响到算法的客户。我们可以这样理解,工厂模式是让我们内部的构造变得高内聚低耦合,而策略模式是让我们的内部代码和外部客户端代码不直接进行联系,而是通过一个桥梁来进行沟通,并且使相同算法或功能的代码进行封装。
大家通过上面的UML图上可以看出,策略模式的思想为封装算法类,通过一个上下文类,来沟通客户端与服务端的代码。
通用接口
/**
* @Auther: yjntue
* @Date: 2020/3/5 16:16
* @Description: 此为接口,用于具体的代码来实现使用
*/
public interface StrategySuper {
//具体的策略都要实现此接口
void strategy();
}
策略A、策略B、策略C的具体算法实现
/**
* @Auther: yjntue
* @Date: 2020/3/5 16:18
* @Description: 策略A的具体实现
*/
public class StrategyA implements StrategySuper {
@Override
public void strategy() {
System.out.println("策略A的具体实现");
}
}
/**
* @Auther: yjntue
* @Date: 2020/3/5 16:18
* @Description: 策略B的具体实现
*/
public class StrategyB implements StrategySuper {
@Override
public void strategy() {
System.out.println("策略B的具体实现");
}
}
/**
* @Auther: yjntue
* @Date: 2020/3/5 16:18
* @Description: 策略C的具体实现
*/
public class StrategyC implements StrategySuper {
@Override
public void strategy() {
System.out.println("策略C的具体实现");
}
}
上下文类,作为连接客户端和后台代码端的桥梁
/**
* @Auther: yjntue
* @Date: 2020/3/5 16:21
* @Description: Context类,用于和外界进行联系的类,用来对StrategySuper的引用
*/
public class Context {
StrategySuper strategySuper;
//使用构造器,传入具体的策略。
public Context(StrategySuper strategySuper){
this.strategySuper = strategySuper;
}
//上下文接口,根据具体的策略对象,调用其算法的方法,执行具体的逻辑方法
public void doAction(){
strategySuper.strategy();
}
}
具体调用
/**
* @Auther: yjntue
* @Date: 2020/3/5 16:25
* @Description: 策略模式的应用
*/
public class Client {
public static void main(String[] args) {
//调用策略A
Context context1 = new Context(new StrategyA());
context1.doAction();
//调用策略B
Context context2 = new Context(new StrategyB());
context2.doAction();
//调用策略C
Context context3 = new Context(new StrategyC());
context3.doAction();
}
}
Tips:以上代码有一些是伪代码,所以大家在编译运行的时候要根据自己的实际情况进行修改,切勿直接粘贴复制!