编程设计模式之策略模式
为什么有策略模式?
在软件开发中,经常会遇到需要根据不同的条件来选择不同的算法或行为的情况。如果每次都直接在代码中写入各种条件分支,会导致代码的复杂度增加,可维护性降低,并且不利于后续的扩展和维护。策略模式正是为了解决这一问题而诞生的。
策略模式的设计思路
策略模式的核心思想是定义一系列的算法,将每个算法封装起来,并使它们可以互相替换。这样,客户端就可以根据需要选择不同的算法,而不必关心算法的具体实现。
策略模式包含三个主要角色:
- Context(环境类):用于维护对策略对象的引用,并且负责将客户端的请求委托给策略对象来执行。
- Strategy(策略接口):定义了所有支持的算法的公共接口。它可以是抽象类,也可以是接口,具体实现类则封装了具体的算法。
- ConcreteStrategy(具体策略类):实现了策略接口,提供具体的算法实现。
Java示例代码
下面是一个简单的Java示例代码,演示了策略模式的应用:
// 策略接口
interface Strategy {
void execute();
}
// 具体策略类A
class ConcreteStrategyA implements Strategy {
@Override
public void execute() {
System.out.println("执行策略A");
}
}
// 具体策略类B
class ConcreteStrategyB implements Strategy {
@Override
public void execute() {
System.out.println("执行策略B");
}
}
// 环境类
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
// 创建具体策略对象
Strategy strategyA = new ConcreteStrategyA();
Strategy strategyB = new ConcreteStrategyB();
// 创建环境对象,并设置具体策略对象
Context context = new Context(strategyA);
// 执行策略
context.executeStrategy();
// 切换策略
context.setStrategy(strategyB);
context.executeStrategy();
}
}
SpringBoot工程中如何应用策略模式
在SpringBoot工程中,我们可以使用策略模式来实现某些业务逻辑的动态选择,例如根据用户的VIP等级来计算折扣。以下是一个简单的示例:
首先,定义策略接口:
// 折扣策略接口
public interface DiscountStrategy {
double applyDiscount(double amount);
}
然后,实现具体的折扣策略:
// 普通会员折扣策略
@Component
public class RegularDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double amount) {
return amount * 0.9; // 九折
}
}
// VIP会员折扣策略
@Component
public class VipDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double amount) {
return amount * 0.8; // 八折
}
}
最后,在需要使用折扣的地方,通过Spring的依赖注入来动态选择策略:
@Service
public class CheckoutService {
private final DiscountStrategy discountStrategy;
@Autowired
public CheckoutService(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double calculateTotal(double amount) {
return discountStrategy.applyDiscount(amount);
}
}
通过这种方式,在SpringBoot工程中,我们可以方便地根据需要选择不同的折扣策略,而不需要修改原有的业务逻辑代码。