Java设计模式——策略模式

⚪策略模式(Strategy)是一种行为型设计模式,这种模式通过定义一组算法类,分别封装每个算法,并使它们可以相互替代,来提供不同的行为。

⚪意图:它允许你定义一系列算法,将每个算法封装起来,并使它们可以互换使用,而不影响客户端代码。

⚪以下是工厂方法模式的关键要点:

        ▷ 角色和责任

  1. Context(上下文):它包含了一个对策略对象的引用,并可以在运行时切换不同的策略对象。Context 通常会委托实际的工作给策略对象。
  2. Strategy(策略):策略是一个接口或抽象类,它定义了一系列算法的公共接口。具体的策略类实现了这个接口,每个策略类封装了一个具体的算法。
  3. ConcreteStrategy(具体策略):具体策略类实现了策略接口,提供了算法的具体实现。

        ▷ 工作流程

  1. 客户端代码创建一个 Context 对象,并在构造函数或通过 setter 方法将一个具体策略对象传递给 Context。
  2. 当客户端需要执行某个操作时,它会调用 Context 对象的方法。Context 会委托具体策略对象来执行操作。
  3. 不同的具体策略类提供了不同的算法实现,客户端可以根据需要在运行时选择不同的策略。

        ▷ 示例

//策略接口
interface DiscountStrategy {
    double applyDiscount(double amount);
}
//策略类
class BronzeDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.95; 
    }
}

class SilverDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.90; 
    }
}

class GoldDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.85; 
    }
}
//上下文类
class ShoppingCart {
    private DiscountStrategy discountStrategy;

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

    public double checkout(double cartTotal) {
        if (discountStrategy == null) {
            throw new IllegalStateException("Discount strategy not set.");
        }
        return discountStrategy.applyDiscount(cartTotal);
    }
}

public class Strategy {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        cart.setDiscountStrategy(new SilverDiscount()); 
        
        double cartTotal = 100.0;
        double discountedTotal = cart.checkout(cartTotal);
        
        System.out.println("Total after discount: " + discountedTotal);
    }
}

⚪适用性

  1. 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置-个类的方法。
  2. 需要使用一个算法的不同变体。例如,定义一些反映不空间的空间/时间权衡的算法当这些变体实现为一个算法的类层次时,可以使用策略模式。
  3. 与算法相关的算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、数据结构。
  4. 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的 Strategy 类中,以代替这些条件语句

⚪应用场景

  1. 算法的灵活性:当你需要在运行时选择不同的算法或策略时,策略模式是一个很好的选择。这允许你根据需要轻松切换和扩展算法。
  2. 避免条件语句:策略模式有助于减少大量的条件语句。在不同的条件下,通过选择不同的策略来执行操作,而不是使用复杂的 if-else 或 switch 语句,可以使代码更加清晰和易于维护。
  3. 单一职责原则:策略模式有助于确保每个策略类都只关注一个特定的算法,遵循单一职责原则。
  4. 可替代性:它使你可以轻松地添加新的策略类,从而扩展应用程序的功能,而不必修改现有的代码。

⚪实际已有场景

  1. 排序算法:在 Java 中,java.util.Comparator 接口就是策略模式的一个经典应用。你可以根据不同的比较需求实现不同的 Comparator 实现类,然后将它们传递给排序算法来实现不同的排序策略。
  2. 数据库连接池:在 Spring 中,你可以配置不同的数据库连接池实现(如HikariCP、Apache DBCP、C3P0)作为数据源策略,然后在应用程序中选择并使用不同的连接池。
  3. 消息处理:在 Spring Integration 框架中,策略模式用于处理不同的消息通道,每个通道可以有不同的处理策略。
  4. 支付方式:在电子商务应用中,策略模式可以用于处理不同的支付方式,如信用卡、PayPal、银行转账等。每种支付方式可以作为一个策略实现。
  5. 缓存策略:在 Spring Cache 模块中,你可以选择不同的缓存策略(如Ehcache、Caffeine、Redis)来满足应用程序的需求。
  6. Spring Security:Spring Security 使用策略模式来处理不同的认证和授权策略,允许你根据应用程序的需求配置不同的安全策略。

 

posted @ 2023-10-04 14:06  xiaogh  阅读(105)  评论(0)    收藏  举报