编程设计模式之策略模式

979 阅读2分钟

编程设计模式之策略模式

为什么有策略模式?

在软件开发中,经常会遇到需要根据不同的条件来选择不同的算法或行为的情况。如果每次都直接在代码中写入各种条件分支,会导致代码的复杂度增加,可维护性降低,并且不利于后续的扩展和维护。策略模式正是为了解决这一问题而诞生的。

策略模式的设计思路

策略模式的核心思想是定义一系列的算法,将每个算法封装起来,并使它们可以互相替换。这样,客户端就可以根据需要选择不同的算法,而不必关心算法的具体实现。

策略模式包含三个主要角色:

  1. Context(环境类):用于维护对策略对象的引用,并且负责将客户端的请求委托给策略对象来执行。
  2. Strategy(策略接口):定义了所有支持的算法的公共接口。它可以是抽象类,也可以是接口,具体实现类则封装了具体的算法。
  3. 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工程中,我们可以方便地根据需要选择不同的折扣策略,而不需要修改原有的业务逻辑代码。