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

策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。
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()); // 使用信用卡支付
}
}模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
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();
}
}总结而言,策略模式适用于算法的多变场景,而模板方法模式适合固定流程但部分步骤可定制的情况。在应用这两种模式时,应根据实际需求权衡利弊,避免过度设计,确保代码的清晰和可维护性。