在Java中,策略模式(Strategy Design Pattern)用于定义一系列算法,并将每个算法封装成单独的类,使得它们可以互相替换,让客户端在使用算法时不需要知道具体的实现细节。策略模式是一种行为型设计模式,它允许客户端选择要使用的算法,而无需修改客户端代码。
策略模式包含以下主要角色:
-  环境类(Context):用于维护一个对策略对象的引用,并在需要时调用策略对象的方法。 
-  策略接口(Strategy):定义一个通用的算法接口,所有具体策略类都要实现这个接口。 
-  具体策略类(ConcreteStrategy):实现策略接口,具体定义了不同的算法实现。 
下面是一个简单的示例:
假设有一个商场销售系统,可以根据不同的促销策略计算折扣。
首先,我们创建一个策略接口(Strategy):
public interface DiscountStrategy {
     double calculateDiscount(double amount);
 }
 然后,我们创建不同的具体策略类(ConcreteStrategy)来实现不同的促销策略
public class RegularCustomerStrategy implements DiscountStrategy {
     @Override
     public double calculateDiscount(double amount) {
         return amount * 0.05; // 5% discount for regular customers
     }
 }
public class VIPCustomerStrategy implements DiscountStrategy {
     @Override
     public double calculateDiscount(double amount) {
         return amount * 0.1; // 10% discount for VIP customers
     }
 }
public class SuperVIPCustomerStrategy implements DiscountStrategy {
     @Override
     public double calculateDiscount(double amount) {
         return amount * 0.15; // 15% discount for super VIP customers
     }
 }
 接下来,我们创建环境类(Context),用于维护策略对象的引用,并在需要时调用策略对象的方法:
public class ShoppingCart {
     private DiscountStrategy discountStrategy;
    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
         this.discountStrategy = discountStrategy;
     }
    public double calculateTotalWithDiscount(double amount) {
         if (discountStrategy == null) {
             throw new IllegalStateException("Discount strategy not set!");
         }
         double discountAmount = discountStrategy.calculateDiscount(amount);
         return amount - discountAmount;
     }
 }
 现在,我们可以使用策略模式来计算不同促销策略下的折扣。客户端只需设置合适的策略,而不需要直接处理不同的算法细节:
public class Main {
     public static void main(String[] args) {
         ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.setDiscountStrategy(new RegularCustomerStrategy());
         double regularCustomerTotal = shoppingCart.calculateTotalWithDiscount(100);
         System.out.println("Total amount for regular customer: $" + regularCustomerTotal);
        shoppingCart.setDiscountStrategy(new VIPCustomerStrategy());
         double vipCustomerTotal = shoppingCart.calculateTotalWithDiscount(100);
         System.out.println("Total amount for VIP customer: $" + vipCustomerTotal);
        shoppingCart.setDiscountStrategy(new SuperVIPCustomerStrategy());
         double superVIPCustomerTotal = shoppingCart.calculateTotalWithDiscount(100);
         System.out.println("Total amount for Super VIP customer: $" + superVIPCustomerTotal);
     }
 }
 输出结果:
Total amount for regular customer: $95.0
 Total amount for VIP customer: $90.0
 Total amount for Super VIP customer: $85.0
 这个例子展示了策略模式的实现方式。通过创建策略接口、具体策略类和环境类,并在环境类中维护策略对象的引用,客户端可以选择不同的算法策略,而无需直接处理算法细节。策略模式可以使得算法的选择和使用变得灵活和可扩展,同时也有助于将算法与客户端代码解耦。