侧边栏壁纸
博主头像
Shawe`Blog博主等级

正确的思维是创造一切的前提。

  • 累计撰写 33 篇文章
  • 累计创建 4 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Java设计模式 - 策略模式

定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,策略模式让算法的变化独立于使用算法的客户。

关注如何在运行时选择算法,以便于在不同情况下切换不同的算法。

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。这样客户端可以根据需求选择不同的算法,而不需要改变客户端代码。

下面是一个用Java代码示例实现策略模式的简单示例:

// 定义策略接口
interface PaymentStrategy {
    void pay(int amount);
}

// 具体的支付策略实现类1
class CreditCardPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid with credit card: $" + amount);
    }
}

// 具体的支付策略实现类2
class PayPalPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid with PayPal: $" + amount);
    }
}

// 上下文类,负责维护当前的支付策略
class PaymentContext {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void processPayment(int amount) {
        paymentStrategy.pay(amount);
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        PaymentContext paymentContext = new PaymentContext();

        // 选择信用卡支付策略
        paymentContext.setPaymentStrategy(new CreditCardPayment());
        paymentContext.processPayment(100);

        // 切换为PayPal支付策略
        paymentContext.setPaymentStrategy(new PayPalPayment());
        paymentContext.processPayment(50);
    }
}

在上述示例中,PaymentStrategy 是策略接口,定义了支付操作的方法 pay()CreditCardPaymentPayPalPayment 是具体的支付策略实现类。PaymentContext 是上下文类,负责维护当前的支付策略,并根据选择的策略进行支付处理。

策略模式的优点如下:

  1. 提高了代码的灵活性:客户端可以根据需求动态切换不同的算法或策略,而不需要修改原有代码。

  2. 方便扩展:可以轻松地添加新的策略实现类,符合开闭原则。

  3. 提高了代码的可维护性:将不同的算法封装在独立的类中,易于理解和维护。

策略模式的缺点如下:

  1. 增加了类的数量:每个具体的策略都需要一个单独的类,可能会增加类的数量。

  2. 客户端需要了解不同的策略:客户端需要了解不同的策略实现类,可能会增加复杂性。

适合使用策略模式的场景包括:

  1. 当一个类有多种实现方式或算法时,可以使用策略模式来动态切换。

  2. 当需要在运行时根据需求选择不同的算法时,可以使用策略模式。

  3. 当希望隐藏算法具体实现细节,只暴露统一的接口给客户端时,可以使用策略模式。

总结来说,策略模式通过将不同的算法封装成独立的类,实现了算法与客户端的解耦,提高了代码的灵活性和可维护性。适合在需要动态切换算法或隐藏算法实现细节的场景下使用。

0

评论区