在面向对象编程的世界中,多态性是一颗耀眼的明星,它赋予了对象以根据上下文变化而展现不同行为的能力。而在设计模式中,策略模式(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);
}
}
优点和适用场景
策略模式具有以下优点:
- 解耦:策略模式将算法的具体实现与客户端分离,使得它们可以独立变化,减少了代码之间的耦合度。
- 可扩展性:可以轻松地添加新的策略类,而无需修改现有代码。
- 灵活性:允许客户端在运行时选择不同的策略,以适应不同情境的需求。
策略模式适用于以下场景:
- 在不同情境下需要切换不同的算法或行为。
- 需要避免在代码中使用大量的条件语句来选择算法的实现。
- 需要对算法的实现进行封装,使其易于替换和扩展。
总结
策略模式是一种非常有用的设计模式,适用于需要在不同情境下切换不同算法的场景。它通过将不同的算法封装成独立的策略类,使客户端代码能够在运行时选择合适的策略,从而实现灵活性和可扩展性。策略模式的设计思想有助于避免代码复杂性和耦合度增加的问题。