什么是策略模式?
策略模式是一种设计模式,允许在运行时选择算法或行为的模式。其核心思想是定义一系列算法,把它们一个个封装起来,并使它们可以互相替换。这种模式能够根据不同的情况动态地选择最合适的算法。
通俗来说,在开发的过程中,需要针对不同的情况做执行不同的处理方法,单纯地写 if...else... 会导致扩展性和可维护性变差。
Spring 风格的策略模式
策略模式包含了 3 个部分,分别是:
- 上下文(Context)类:具体策略类的对象,本文主要介绍上下文类通过依赖注入的方式获取具体策略对象。
- 抽象策略(Abstract Strategy)类:定义了策略对象的公共接口或抽象类,具体策略类必须实现的方法。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。
为了方便对比,本文直接改写菜鸟教程的举例。
抽象策略类可以是接口也可以是抽象类,这里推荐使用抽象类。 因为抽象类方法里可以写一些公有逻辑,避免重复代码。
步骤1
创建一个抽象类。
代码语言:javascript复制java 代码解读复制代码public abstract class Strategy {
public int doOperation(int num1, int num2) {
System.out.println("公有逻辑...");
return 0;
}
}
步骤2
创建基础抽象类的具体策略类。
代码语言:javascript复制java 代码解读复制代码import org.springframework.stereotype.Service;
@Service("add")
public class OperationAdd extends Strategy{
public int doOperation(int num1, int num2) {
super.doOperation(num1, num2);
System.out.println("执行加法计算");
return num1 num2;
}
}
代码语言:javascript复制java 代码解读复制代码import org.springframework.stereotype.Service;
@Service("subtract")
public class OperationSubtract extends Strategy{
public int doOperation(int num1, int num2) {
super.doOperation(num1, num2);
System.out.println("执行减法计算");
return num1 - num2;
}
}
代码语言:javascript复制java 代码解读复制代码import org.springframework.stereotype.Service;
@Service("multiply")
public class OperationMultiply extends Strategy {
public int doOperation(int num1, int num2) {
super.doOperation(num1, num2);
System.out.println("执行乘法计算");
return num1 * num2;
}
}
步骤3(重点)
在上下文(Context)类中注入策略类并调用。上下文类就是执行算法的类,在项目中一般会是一个 Service 类。
代码语言:javascript复制java 代码解读复制代码@Service
public class ContextServiceImpl implements ContextService {
// 注入策略对象,key是注册时的名称,value是策略对象
@Resource
private Map<String, Strategy> strategyMap;
@Override
public int executeStrategy(int num1, int num2) {
// 执行加法策略对象
Strategy addStrategy = strategyMap.get("add");
int add = addStrategy.doOperation(num1, num2);
System.out.println("add:" add);
// 执行减法策略对象
Strategy subtractStrategy = strategyMap.get("subtract");
int subtract = subtractStrategy.doOperation(num1, num2);
System.out.println("subtract:" subtract);
// 执行乘法策略对象
Strategy multiplyStrategy = strategyMap.get("multiply");
int multiply = multiplyStrategy.doOperation(num1, num2);
System.out.println("multiply:" multiply);
return 0;
}
}
步骤4
测试一下。
代码语言:javascript复制java 代码解读复制代码@SpringBootTest
public class StrategyTest {
@Resource
private ContextService contextService;
@Test
public void test(){
contextService.executeStrategy(10, 5);
}
}
运行结果:
代码语言:javascript复制makefile 代码解读复制代码公有逻辑...
执行加法计算
add:15
公有逻辑...
执行减法计算
subtract:5
公有逻辑...
执行乘法计算
multiply:50
提示
在使用策略模式时,也需要注意不要过度使用,特别是在只有少数策略时(少于3个),或者策略很不可能变化时。因为引入策略模式会增加一些对象的创建和交互,可能会引入额外的复杂性。正确的应用策略模式可以使系统设计更加灵活,易于维护和扩展。