掘金 后端 ( ) • 2024-05-17 09:26

策略模式和模板方法模式都是行为设计模式,它们在处理算法变化和代码复用方面各有千秋。本文将深入浅出地介绍这两种模式,探讨它们的常见问题、易错点以及如何避免,并通过代码示例加以说明。

image.png

1. 策略模式 (Strategy Pattern)

定义

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

常见问题与易错点

  • 策略选择的复杂度:当策略数量增多时,选择合适的策略可能变得复杂。
  • 策略的滥用:对于简单的条件分支,使用策略模式可能会过度设计。

代码示例

interface PaymentStrategy {
    void pay(int amount);
}

class CreditCardStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid with credit/debit card");
    }
}

class PayPalStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using PayPal.");
    }
}

class ShoppingCart {
    private List<Item> items;
    //...
    public void pay(PaymentStrategy paymentMethod) {
        int total = calculateTotal();
        paymentMethod.pay(total);
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        // 添加商品到购物车
        //...
        cart.pay(new CreditCardStrategy()); // 使用信用卡支付
    }
}

2. 模板方法模式 (Template Method Pattern)

定义

模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

常见问题与易错点

  • 过度抽象:模板方法过于通用,可能会导致子类实现复杂。
  • 滥用继承:当子类间的差异很大时,使用模板方法可能不是最佳选择。

代码示例

abstract class AbstractClass {
    public final void templateMethod() {
        // 具体步骤1
        specificMethod();
        // 具体步骤2
        commonMethod();
        // 具体步骤3
    }

    protected abstract void specificMethod(); // 抽象方法,由子类实现

    private void commonMethod() {
        // 公共方法实现
        System.out.println("Common method implementation");
    }
}

class ConcreteClassA extends AbstractClass {
    @Override
    protected void specificMethod() {
        System.out.println("ConcreteClassA's specific method implementation");
    }
}

class ConcreteClassB extends AbstractClass {
    @Override
    protected void specificMethod() {
        System.out.println("ConcreteClassB's specific method implementation");
    }
}

public class Main {
    public static void main(String[] args) {
        AbstractClass a = new ConcreteClassA();
        a.templateMethod();
        AbstractClass b = new ConcreteClassB();
        b.templateMethod();
    }
}

总结而言,策略模式适用于算法的多变场景,而模板方法模式适合固定流程但部分步骤可定制的情况。在应用这两种模式时,应根据实际需求权衡利弊,避免过度设计,确保代码的清晰和可维护性。