策略模式和模板方法模式都是行为设计模式,它们在处理算法变化和代码复用方面各有千秋。本文将深入浅出地介绍这两种模式,探讨它们的常见问题、易错点以及如何避免,并通过代码示例加以说明。
1. 策略模式 (Strategy Pattern)
定义
策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。
常见问题与易错点
- 策略选择的复杂度:当策略数量增多时,选择合适的策略可能变得复杂。
- 策略的滥用:对于简单的条件分支,使用策略模式可能会过度设计。
代码示例
代码语言:javascript复制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)
定义
模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
常见问题与易错点
- 过度抽象:模板方法过于通用,可能会导致子类实现复杂。
- 滥用继承:当子类间的差异很大时,使用模板方法可能不是最佳选择。
代码示例
代码语言:javascript复制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();
}
}
总结而言,策略模式适用于算法的多变场景,而模板方法模式适合固定流程但部分步骤可定制的情况。在应用这两种模式时,应根据实际需求权衡利弊,避免过度设计,确保代码的清晰和可维护性。