文章目录

  • 📋模板模式概念
  • 📖组成要素
  • 🔖代码示例
  • 📈总结



java设计模式之模板模式(结合示例)_开发语言

📋模板模式概念

在Java中,模板模式(Template Pattern)是一种行为设计模式,它定义了一个操作中的算法框架,并将某些步骤延迟到子类中实现。模板模式通过使用继承来提供算法的通用结构,同时允许子类在不改变算法结构的情况下重新定义其中的某些步骤。

📖组成要素

  • 模板模式由以下几个关键要素组成:
  1. 抽象模板(Abstract Template):定义了算法的基本结构和骨架,其中包含了一个或多个抽象方法或可选的钩子方法。
  2. 具体模板(Concrete Template):继承自抽象模板,并实现其中定义的抽象方法和钩子方法,完成算法中的具体步骤。
  3. 钩子方法(Hook Method):在抽象模板中可以定义的可选方法,子类可以选择性地覆盖或实现这些方法。

🔖代码示例

下面是一个示例,展示了如何使用模板模式来制作咖啡和茶:

/**
 * @Author: hrd
 * @CreateTime: 2023/7/26 11:13
 * @Description:
 */
public class TemplateDemo {
    public static void main(String[] args) {
        Beverage coffee = new Coffee();
        coffee.prepareBeverage();

        System.out.println("------------------");

        Beverage tea = new Tea();
        tea.prepareBeverage();
    }
}
// 抽象模板
abstract class Beverage {
    // 模板方法,定义了算法的基本结构和流程
    final void prepareBeverage() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    // 具体步骤,由子类实现
    abstract void brew();

    // 具体步骤,由子类实现
    abstract void addCondiments();

    void boilWater() {
        System.out.println("Boiling water");
    }

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

    // 钩子方法,由子类选择性地覆盖
    boolean customerWantsCondiments() {
        return true;
    }
}

// 具体模板 - 咖啡
class Coffee extends Beverage {
    void brew() {
        System.out.println("Brewing coffee");
    }

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

// 具体模板 - 茶
class Tea extends Beverage {
    void brew() {
        System.out.println("Steeping tea");
    }

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

    // 覆盖钩子方法
    boolean customerWantsCondiments() {
        return false;
    }
}

在上述示例中,抽象模板Beverage定义了制作饮料的基本结构和流程,并将一些具体步骤(如brew()addCondiments())延迟到具体子类中实现。具体子类CoffeeTea分别继承自抽象模板,并实现了自己特定的步骤。customerWantsCondiments()是一个钩子方法,在茶的具体子类中选择性地覆盖。

通过模板模式,我们可以在不改变算法结构的情况下,灵活地定义和扩展特定类型的饮料制作过程。

📈总结

  • 在Java中,模板模式适用于以下场景:
  1. 定义算法的骨架:当一个算法具有固定的执行步骤和顺序,但其中某些步骤需要根据具体情况进行实现时,可以使用模板模式。这样可以将算法的通用结构定义在抽象模板中,而将可变的部分延迟到具体子类中实现。
  2. 共享公共行为:当多个类或对象之间具有相似的行为和操作,但又有一些差异时,可以使用模板模式来共享公共的行为。通过将公共行为提取到抽象模板中,避免了代码重复,并提供了一种灵活的方式来处理不同的差异。
  3. 控制子类扩展:模板模式可以用于限制子类的扩展。通过在抽象模板中声明关键方法为 final 或使用钩子方法来控制子类的行为,确保算法的整体结构不会被破坏。
  4. 框架和库设计:模板模式在设计框架和库时非常有用。它提供了一种基础架构,让用户能够根据自己的需求来扩展和实现特定的功能。
  • 需要注意的是,模板模式适用于那些具有固定结构和流程,并且存在可变部分的场景。它可以提供一种通用的算法框架,同时仍然允许子类灵活地定义和实现自己的行为。
  • 总结起来,模板模式在Java中适用于需要定义算法骨架、共享公共行为、控制子类扩展以及框架和库设计等场景。
  • 模板模式在Java中广泛应用于各种框架和库中,例如Servlet生命周期、JUnit测试框架等。它提供了一种可重用和可扩展的方式来定义算法的通用结构。