Java学设计模式之策略模式

一、策略模式概念

1.1 什么是策略模式

策略模式是一种行为型设计模式,用于定义一系列算法,将每个算法封装在独立的策略类中,并使它们可以互相替换。策略模式可以使算法的变化独立于使用算法的客户端。

结构

策略模式通常包含以下几个要素:

  1. Context(环境): 维护一个对策略对象的引用,并且负责调用所选策略的算法。

  2. Strategy(策略): 定义所有支持的算法的公共接口。它可以是一个接口、抽象类或具体类。

  3. ConcreteStrategy(具体策略): 实现了Strategy接口的具体算法。

二、策略模式代码

2.1 策略

public interface DiscountStrategy {
    double applyDiscount(double amount);
}

2.2 具体策略

public class NoDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount;
    }
}
public class TenPercentDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.9;
    }
}
public class TwentyPercentDiscountStrategy implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.8;
    }
}

2.3 环境

public class ShoppingCart {
    private DiscountStrategy discountStrategy;

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double checkout(double amount) {
        return discountStrategy.applyDiscount(amount);
    }
}

2.4 测试类

public class StrategyPatternTest {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        // 不打折
        cart.setDiscountStrategy(new NoDiscountStrategy());
        double amount1 = cart.checkout(100);
        System.out.println("不打折: " + amount1);

        // 打9折
        cart.setDiscountStrategy(new TenPercentDiscountStrategy());
        double amount2 = cart.checkout(100);
        System.out.println("打9折: " + amount2);

        // 打8折
        cart.setDiscountStrategy(new TwentyPercentDiscountStrategy());
        double amount3 = cart.checkout(100);
        System.out.println("打8折: " + amount3);
        // 输出:
        // 不打折: 100.0
        // 打9折: 90.0
        // 打8折: 80.0
    }
}

三、总结

策略模式的优点包括:

  • 可以轻松地切换不同的算法,使得系统更加灵活,易于扩展。
  • 策略类之间相互独立,符合开闭原则,易于单元测试。

缺点包括:

  • 客户端必须知道所有的策略,并且自行选择适合的策略,增加了客户端的复杂度。
  • 如果策略类过多,可能会导致类的数量增加,使得代码变得复杂。
posted @ 2024-05-10 10:56  Kllin  阅读(17)  评论(0编辑  收藏  举报