策略模式本质:多态性的精髓

413 阅读3分钟

在面向对象编程的世界中,多态性是一颗耀眼的明星,它赋予了对象以根据上下文变化而展现不同行为的能力。而在设计模式中,策略模式(Strategy Pattern)恰恰是多态性最闪耀的展示之一,充分发挥了多态性的本质。

从多态性谈起

多态性是面向对象编程的重要概念,它能够让对象在不同情境下表现出不同的行为,即使它们拥有相同的接口。多态性在编译时和运行时两个层面上体现,后者也称为动态多态性。

策略模式中的多态性

策略模式是一种典型的行为型设计模式,其核心思想是将不同的算法封装成不同的策略类,然后通过上下文类来管理这些策略。每个具体策略类都实现了相同的策略接口,保证了它们具有一致的方法签名。

策略模式之所以能够体现多态性,正是因为客户端在运行时可以根据需要选择不同的策略,而上下文类则会基于所选策略的具体实现来调用相应的方法。在这个过程中,实际执行的是所选策略的具体代码,这就是多态性的活灵活现的展现。

策略模式的关键组件包括:

  • 策略接口(Strategy Interface): 定义不同策略类的共同接口,通常包含一个或多个方法。
  • 具体策略类(Concrete Strategies): 实现策略接口,提供具体的算法实现。
  • 上下文类(Context): 包含一个策略接口的成员变量,用于持有具体策略的实例。上下文类提供方法,允许客户端设置和切换策略,并在需要时执行策略。

示例:多态性在策略模式中的应用

考虑一个在线商城,用户可以选择不同的支付方式进行付款,如信用卡、支付宝、微信支付等。使用策略模式,可以将不同支付方式封装成具体策略类,然后通过上下文类在运行时选择合适的支付策略。

classDiagram
  direction TB
  class PaymentStrategy{
      <<interface>>
      pay(amount)
  }

  class PaymentContext{
      -strategy: PaymentStrategy
      +setPaymentStrategy(strategy) 
      +executePayment(amount)
  }

  class CreditCardPayment{
      pay(amount)
  }

  class AlipayPayment{
      pay(amount)
  }

  PaymentStrategy <|-- CreditCardPayment
  PaymentStrategy <|-- AlipayPayment

  PaymentContext o-- PaymentStrategy
// 策略接口
interface PaymentStrategy {
    void pay(int amount);
}

// 具体策略类:信用卡支付
class CreditCardPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid " + amount + " via Credit Card.");
    }
}

// 具体策略类:支付宝支付
class AlipayPayment implements PaymentStrategy {
    public void pay(int amount) {
        System.out.println("Paid " + amount + " via Alipay.");
    }
}

// 上下文类:支付上下文
class PaymentContext {
    private PaymentStrategy strategy;

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

    public void executePayment(int amount) {
        strategy.pay(amount);
    }
}

public class Main {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();

        PaymentStrategy creditCardPayment = new CreditCardPayment();
        context.setPaymentStrategy(creditCardPayment);
        context.executePayment(100);

        PaymentStrategy alipayPayment = new AlipayPayment();
        context.setPaymentStrategy(alipayPayment);
        context.executePayment(200);
    }
}
	

优点和适用场景

策略模式具有以下优点:

  • 解耦:策略模式将算法的具体实现与客户端分离,使得它们可以独立变化,减少了代码之间的耦合度。
  • 可扩展性:可以轻松地添加新的策略类,而无需修改现有代码。
  • 灵活性:允许客户端在运行时选择不同的策略,以适应不同情境的需求。

策略模式适用于以下场景:

  • 在不同情境下需要切换不同的算法或行为。
  • 需要避免在代码中使用大量的条件语句来选择算法的实现。
  • 需要对算法的实现进行封装,使其易于替换和扩展。

总结

策略模式是一种非常有用的设计模式,适用于需要在不同情境下切换不同算法的场景。它通过将不同的算法封装成独立的策略类,使客户端代码能够在运行时选择合适的策略,从而实现灵活性和可扩展性。策略模式的设计思想有助于避免代码复杂性和耦合度增加的问题。