自学内容网 自学内容网

Template Method(模板方法)

1)意图

定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2)结构

模板方法模式的结构图如图7-47 所示。
在这里插入图片描述
其中:

  • AbstractClass(抽象类) 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤;实现模板方法,定一个算法的骨架,该模板方法不仅调用原语操作,也调用定义在 AbstractClass 或其他对象中的操作。

  • ConcreteClass(具体类) 实现原语操作以完成算法中与特定子类相关的步骤。

3)适用性

Template Method 模式适用于:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

  • 各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。

  • 控制子类扩展。模板方法旨在特定点调用“hook”操作(默认的行为,子类可以在必要时进行重定义扩展),这就只允许在这些点进行扩展。

4 应用举例

制作咖啡和茶

假设我们要设计一个系统来模拟制作咖啡和茶的过程,虽然制作咖啡和茶的基本步骤相似(如烧水、倒水、加配料),但某些步骤会有差异(如是否需要磨豆子、是否需要泡茶叶)。这里可以使用模板方法模式来实现。

Java代码示例:

// 抽象类:定义制作饮品的模板方法
abstract class Beverage {
    // 模板方法,定义算法的骨架
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    protected void boilWater() {
        System.out.println("烧开水");
    }

    protected void pourInCup() {
        System.out.println("倒入杯中");
    }

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

    // 钩子方法,允许子类覆盖默认行为
    protected void addCondiments() {
        System.out.println("添加配料");
    }
}

// 具体类:实现不同的饮品制作过程
class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("研磨咖啡豆");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入糖和奶");
    }
}

class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("浸泡茶叶");
    }
}

public class TemplateMethodPatternDemo {
    public static void main(String[] args) {
        // 制作咖啡
        Beverage coffee = new Coffee();
        System.out.println("制作咖啡:");
        coffee.prepareRecipe();
        System.out.println();

        // 制作茶
        Beverage tea = new Tea();
        System.out.println("制作茶:");
        tea.prepareRecipe();
    }
}

在这个例子中:

  • Beverage 是抽象类,定义了制作饮品的模板方法 prepareRecipe(),其中包含了所有饮品制作的通用步骤。
  • CoffeeTea 是具体类,它们分别实现了 brew() 方法,以适应各自的特点。同时,addCondiments() 方法在 Coffee 中被覆盖,以加入特定的配料。

通过模板方法模式,我们可以定义一个算法的框架,同时允许子类控制算法的细节,这有助于代码的复用和维护。


原文地址:https://blog.csdn.net/QQ657205470/article/details/143502008

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!