Java一分钟之-设计模式:策略模式与模板方法

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。

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

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

常见问题与易错点
策略选择的复杂度:当策略数量增多时,选择合适的策略可能变得复杂。
策略的滥用:对于简单的条件分支,使用策略模式可能会过度设计。
代码示例
java
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 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()); // 使用信用卡支付
}
}

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

常见问题与易错点
过度抽象:模板方法过于通用,可能会导致子类实现复杂。
滥用继承:当子类间的差异很大时,使用模板方法可能不是最佳选择。
代码示例
java
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();
}
}
总结而言,策略模式适用于算法的多变场景,而模板方法模式适合固定流程但部分步骤可定制的情况。在应用这两种模式时,应根据实际需求权衡利弊,避免过度设计,确保代码的清晰和可维护性。

目录
相关文章
|
27天前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
|
22天前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
26天前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)
|
26天前
|
设计模式 算法 Java
Java中的策略模式
Java中的策略模式
27 1
|
27天前
|
设计模式 监控 Java
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
|
27天前
|
设计模式 Java 程序员
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
|
27天前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Builder(构造器模式)
【设计模式】JAVA Design Patterns——Builder(构造器模式)
|
4天前
|
设计模式 存储 安全
Java中的23种设计模式
Java中的23种设计模式
6 1
|
11天前
|
设计模式 算法 架构师
设计模式-策略模式详解
系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
340 0
|
11天前
|
设计模式 存储 Java
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
7 0