谈谈你对模板方法模式的理解?

1 个回答

  • 明月
    天道忌满,人道忌全。 水满则溢, 物极必反。
    模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的骨架,而将一些步骤的具体实现延迟到子类中。通过这种方式,子类可以重新定义算法的某些步骤,而不改变算法的结构。 #### 优点: 1. **提高代码复用性**:将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中,从而实现代码的复用。 2. **实现了反向控制**:通过一个父类调用其子类的操作,子类通过继承父类并实现父类的方法来扩展不同的行为,从而实现了反向控制。 3. **符合开闭原则**:通过对子类的具体实现进行扩展,不需要修改已有的父类代码,从而符合开闭原则(对扩展开放,对修改关闭)。 ### 示例 #### 抽象类(模板方法模式中的模板类) ```java abstract class TeaMaker { // 模板方法 public final void makeTea() { boilWater(); addTea(); pourInCup(); addCondiments(); } // 公共方法 private void boilWater() { System.out.println("Boiling water"); } // 公共方法 private void pourInCup() { System.out.println("Pouring into cup"); } // 抽象方法,由子类具体实现 abstract void addTea(); // 抽象方法,由子类具体实现 abstract void addCondiments(); } ``` #### 具体实现类 ```java class PuErTeaMaker extends TeaMaker { @Override void addTea() { System.out.println("Adding Pu-Erh tea"); } @Override void addCondiments() { System.out.println("Adding lemon"); } } class IronGoddessTeaMaker extends TeaMaker { @Override void addTea() { System.out.println("Adding Iron Goddess tea"); } @Override void addCondiments() { System.out.println("Adding honey"); } } ``` #### 客户端代码 ```java public class TemplateMethodPatternDemo { public static void main(String[] args) { TeaMaker puErTeaMaker = new PuErTeaMaker(); puErTeaMaker.makeTea(); System.out.println(); TeaMaker ironGoddessTeaMaker = new IronGoddessTeaMaker(); ironGoddessTeaMaker.makeTea(); } } ``` ### 示例解释 1. **抽象类 `TeaMaker`** 定义了一个模板方法 `makeTea()`,该方法定义了制作茶的算法骨架。算法的具体步骤 `boilWater()` 和 `pourInCup()` 是固定的,而 `addTea()` 和 `addCondiments()` 是抽象方法,需要由子类实现。 2. **具体实现类 `PuErTeaMaker` 和 `IronGoddessTeaMaker`** 继承了 `TeaMaker` 抽象类,并实现了 `addTea()` 和 `addCondiments()` 方法,提供了各自的具体实现。 3. **客户端代码 `TemplateMethodPatternDemo`** 创建了 `PuErTeaMaker` 和 `IronGoddessTeaMaker` 对象,并调用 `makeTea()` 方法,执行了一系列操作。 ### 应用场景 - 多个子类有公有的方法,并且逻辑基本相同时。 - 重要、复杂的算法,可以把核心算法设计为模板方法,周边相关细节由各个子类实现。 - 重构时,模板方法模式是经常使用的模式,它把相同的代码提取到父类中,避免代码重复。 ### 生活中的例子 1. **喝茶**:烧水、放入茶叶、喝茶。放入的茶叶每个人的喜好不一样,有的是普洱,有的是铁观音等。 2. **每日工作**:上班打卡、工作、下班打卡。每个人的工作内容不一样,有后端开发、前端开发、测试、产品等。
    发布于 2024-08-05 08:46 •IP属地 四川
    举报
    评论
    收藏