【设计模式-模板】

定义

模板方法模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并将一些步骤延迟到子类中实现。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。

UML图

组成角色

  • AbstractClass(抽象类):
    定义模板方法,包含算法的基本框架。它可能包含一些基本实现或抽象方法,供子类实现。
  • ConcreteClass(具体类):
    实现抽象类中的抽象方法,并可能覆盖模板方法中的某些步骤。具体类提供算法的具体实现。
  • templateMethod(模板方法):
    定义算法的骨架,调用各个步骤的方法。

代码

java 复制代码
// AbstractClass
abstract class CaffeineBeverage {
    // 模板方法
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 基本方法
    void boilWater() {
        System.out.println("Boiling water");
    }

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

    // 基本方法
    void pourInCup() {
        System.out.println("Pouring into cup");
    }

    // 抽象方法,子类可以选择实现
    abstract void addCondiments();
}

// ConcreteClass1
class Coffee extends CaffeineBeverage {
    @Override
    void brew() {
        System.out.println("Dripping coffee through filter");
    }

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

// ConcreteClass2
class Tea extends CaffeineBeverage {
    @Override
    void brew() {
        System.out.println("Steeping the tea");
    }

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

// Client code
public class TemplateMethodDemo {
    public static void main(String[] args) {
        CaffeineBeverage coffee = new Coffee();
        coffee.prepareRecipe();
        
        System.out.println();

        CaffeineBeverage tea = new Tea();
        tea.prepareRecipe();
    }
}

优点

  • 代码复用:将算法的公共部分放在抽象类中,提高了代码的复用性。
  • 灵活性:子类可以自由扩展或修改算法的某些部分,而不需要修改整个算法。
  • 清晰性:算法的结构在模板方法中清晰可见,易于理解。

缺点

  • 不灵活:子类必须遵循模板方法定义的算法结构,可能导致不必要的复杂性。
  • 类的数量增加:随着算法的扩展,可能会导致类的数量增加,从而增加管理的复杂性。

使用场景

  • 当有多个子类需要重用相同的算法时。
  • 当需要在不改变算法结构的前提下扩展算法时。
  • 当算法的步骤可以由不同的子类实现,但整体流程是固定的时。
相关推荐
杨充9 小时前
07.迪米特原则介绍
设计模式
码农的天塌了13 小时前
Java 设计模式之享元模式(Flyweight Pattern)
java·设计模式·享元模式
11在上班14 小时前
剖析initData在水合中的设计哲学
前端·设计模式
找了一圈尾巴14 小时前
设计模式(创建型)-单例模式
单例模式·设计模式
用户861782773651814 小时前
责任链
java·后端·设计模式
hope_wisdom15 小时前
实战设计模式之解释器模式
设计模式·解释器模式·软件工程·软件构建·架构设计
开发者工具分享1 天前
微服务架构中10个常用的设计模式
微服务·设计模式·架构
colin1 天前
前端场景中的设计模式
设计模式
Cutey9161 天前
前端如何实现菜单的权限控制(RBAC)
前端·javascript·设计模式
程序视点2 天前
Java中JDK里用到了哪些设计模式?让面试官眼前一亮!
java·设计模式