策略模式
摘要
本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的UML,详解介绍了策略模式的原理及应用。本文可帮助读者快速掌握策略模式,以便工作学习中使用策略模式。
一、策略模式
在生活中,我们要达到一个目标,可以采用不同的策略,比如从深圳到北京,我们有至少三种策略,第一种策略坐飞机,第二种策略是高铁,第三种策略是自驾。
在编程中,一个执行类也会有多个策略可以选择,所以这里存在变化,就会导致后期对代码的重构,从而违背了“开闭原则”。
策略模式将不同策略与执行类进行解耦,让策略单独封装成类,这样策略就具有很强的可扩展性。
二、策略模式的实现
2.1 场景设计
执行者Tom、执行者Damon,他们的执行策略有planA、planB、planC。
2.2 代码实现
2.2.1 Strategy 策略抽象类
package ft.patterns.stragegy;
public interface Strategy {
public void handle();
}
2.2.2 PlanA 策略具体类
package ft.patterns.stragegy;
public class PlanA implements Strategy{
@Override
public void handle() {
System.out.println("Start plan A");
}
}
2.2.3 PlanB 策略具体类
package ft.patterns.stragegy;
public class PlanB implements Strategy{
@Override
public void handle() {
System.out.println("Start plan B");
}
}
2.2.4 PlanC 策略具体类
package ft.patterns.stragegy;
public class PlanC implements Strategy{
@Override
public void handle() {
System.out.println("Start plan C");
}
}
2.2.5 Executor 抽象执行类
package ft.patterns.stragegy;
// 声明为抽象类,即可以声明接口方法,也可以定义一些具体实现
public abstract class Executor {
protected Strategy strategy;
abstract void handle();
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
2.2.6 ExecutorTom 具体执行类
package ft.patterns.stragegy;
public class ExecutorTom extends Executor{
@Override
void handle() {
this.strategy.handle();
}
}
2.2.7 ExecutorDamon 具体执行类
package ft.patterns.stragegy;
public class ExecutorDamon extends Executor{
@Override
void handle() {
this.strategy.handle();
}
}
2.2.8 Main 测试类
package ft.patterns.stragegy;
public class Main {
public static void main(String[] args) {
try {
Class clz = Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Strategy planA = new PlanA();
Strategy planB = new PlanB();
Strategy planC = new PlanC();
Executor Tom = new ExecutorTom();
Executor Damon = new ExecutorDamon();
Tom.setStrategy(planA);
Tom.handle();
Tom.setStrategy(planB);
Tom.handle();
Damon.setStrategy(planC);
Damon.handle();
}
}