Java设计模式 二十 模板方法模式 (Template Method Pattern)

模板方法模式 (Template Method Pattern)

模板方法模式是一种行为型设计模式,它通过定义一个操作中的算法框架,将某些步骤的实现延迟到子类中。模板方法模式使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。模板方法模式的关键思想是:定义一个固定的算法框架,将具体步骤的实现延迟到子类


1. 模板方法模式的组成

模板方法模式通常包含以下几个角色:

  • AbstractClass(抽象类):定义了算法的模板方法,模板方法由多个步骤组成,其中有些步骤是具体实现,有些步骤是抽象的,子类需要重写这些抽象步骤。模板方法通常是一个公共的操作,包含了算法的主要结构。

  • ConcreteClass(具体类):实现抽象类中的抽象方法,并提供具体的实现。子类可以覆盖抽象方法来改变算法的具体行为。

  • Client(客户端):客户端通过调用抽象类中定义的模板方法来执行算法。


2. 模板方法模式的工作流程

  1. 抽象类定义了一个算法的模板,模板方法中包含了若干个步骤。
  2. 具体类实现了抽象类中的某些步骤。可以通过重写这些方法来实现不同的行为。
  3. 客户端代码通过调用抽象类中的模板方法来执行算法。

模板方法模式的目的是把固定的部分放在父类中,而允许子类去定义可变的部分。


3. 模板方法模式的实现

场景示例:做咖啡与茶的过程

假设我们有一个抽象类Beverage,它定义了制作饮料的模板,具体的制作细节(比如咖啡或茶的具体做法)由子类来实现。这个例子展示了模板方法模式如何用来抽象化饮料制作过程的共同步骤。


1) 定义抽象类

Beverage类是抽象类,它定义了制作饮料的步骤,prepareRecipe()方法就是模板方法,决定了制作饮料的顺序。

// 抽象类:饮料
public abstract class Beverage {

    // 模板方法
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 固定步骤
    private void boilWater() {
        System.out.println("Boiling water");
    }

    private void pourInCup() {
        System.out.println("Pouring into cup");
    }

    // 可变步骤,子类必须实现
    protected abstract void brew();
    protected abstract void addCondiments();
}

2) 定义具体类

Coffee类和Tea类继承自Beverage类,并实现了brew()addCondiments()方法,分别定义了具体的咖啡和茶的制作过程。

// 具体类:咖啡
public class Coffee extends Beverage {

    @Override
    protected void brew() {
        System.out.println("Brewing coffee");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding sugar and milk");
    }
}

// 具体类:茶
public class Tea extends Beverage {

    @Override
    protected void brew() {
        System.out.println("Steeping the tea");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding lemon");
    }
}

3) 客户端代码

客户端代码通过调用模板方法prepareRecipe()来完成饮料的制作。客户端不需要关心具体的步骤,只需使用prepareRecipe()方法即可。

public class Client {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepareRecipe();  // 输出:制作咖啡的步骤

        System.out.println("\n");

        Beverage tea = new Tea();
        tea.prepareRecipe();  // 输出:制作茶的步骤
    }
}

运行结果:
Boiling water
Brewing coffee
Pouring into cup
Adding sugar and milk

Boiling water
Steeping the tea
Pouring into cup
Adding lemon

4. 模板方法模式的优点

  1. 代码复用: 通过将固定的算法步骤放在抽象类中,避免了代码的重复,促进了代码的复用。
  2. 控制反转: 子类通过实现抽象方法来定制可变的部分,不需要修改算法的结构,符合开闭原则。
  3. 算法的固定结构: 模板方法确保了算法的执行顺序,算法结构固定,不允许修改。
  4. 提高可扩展性: 子类可以通过实现抽象方法来扩展算法的可变部分,而不改变算法的固定结构。

5. 模板方法模式的缺点

  1. 类的继承关系较深: 模板方法模式使用了继承的方式来重写模板方法中的部分步骤,可能会导致类的继承关系过于复杂。
  2. 灵活性较低: 模板方法模式在某些情况下可能会限制子类的灵活性,因为子类只能通过覆盖父类的抽象方法来改变某些步骤,无法改变算法的整体结构。

6. 模板方法模式的应用场景

  • 数据处理: 在数据处理过程中,存在一些固定的步骤(如读取文件、处理数据、输出结果等),可以使用模板方法模式将固定的步骤提取到父类中,而让子类负责特定的处理。
  • 游戏开发: 游戏中可能有很多固定的游戏流程(如玩家进入、战斗、结算等),可以用模板方法来控制这些固定的步骤,而让子类实现具体的战斗过程等。
  • 框架设计: 一些框架会提供一个模板方法,要求开发者只需实现其中的某些步骤,而不需要关心框架的整体结构。例如,Spring框架中的生命周期管理可以通过模板方法模式来实现。

7. 总结

模板方法模式通过定义算法的框架,将部分步骤的实现推迟到子类,使得子类能够在不改变算法结构的前提下,定制某些具体步骤。它是一个非常适用于处理具有固定执行顺序的算法的设计模式。模板方法模式提高了代码复用性和扩展性,但同时也带来了继承关系的复杂化,需要在合理的场景下使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值