8Head First Design Patterns(第2版)

模板方法模式

算法骨架

模板方法钩子方法好莱坞原则继承复用

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第8章:模板方法模式(Template Method Pattern)

一、导读

1.1 本章学习目标

第8章讲解模板方法模式——在父类中定义算法骨架,子类实现具体步骤。

1.2 为什么第八章如此重要

模板方法模式是继承复用的经典应用,通过"好莱坞原则"实现控制反转。

1.3 核心问题引导

模板方法模式的结构是什么?

钩子方法的作用是什么?

好莱坞原则是什么?

模板方法和策略模式有什么区别?


二、核心概念详解

8.1 模板方法

java
public abstract class Beverage {
    // 模板方法:定义算法骨架
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }
    
    abstract void brew();
    abstract void addCondiments();
    
    void boilWater() { System.out.println("Boiling water"); }
    void pourInCup() { System.out.println("Pouring into cup"); }
}

public class Tea extends Beverage {
    void brew() { System.out.println("Steeping the tea"); }
    void addCondiments() { System.out.println("Adding lemon"); }
}

public class Coffee extends Beverage {
    void brew() { System.out.println("Dripping coffee through filter"); }
    void addCondiments() { System.out.println("Adding sugar and milk"); }
}

8.2 钩子方法

java
public abstract class Beverage {
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {  // 钩子
            addCondiments();
        }
    }
    
    // 钩子:子类可以选择性覆盖
    boolean customerWantsCondiments() { return true; }
    
    abstract void brew();
    abstract void addCondiments();
    void boilWater() { }
    void pourInCup() { }
}

8.3 好莱坞原则

好莱坞原则:
"不要打电话给我们,我们会打电话给你"

在模板方法中:
- 父类控制流程
- 子类只负责实现具体步骤
- 子类不需要主动调用父类

三、实战案例

8.1 排序中的模板方法

java
// Java 的 Arrays.sort 使用模板方法
// 算法骨架在 sort 方法中
// 比较逻辑由 compareTo 提供

public class Duck implements Comparable<Duck> {
    String name;
    int weight;
    
    public int compareTo(Duck other) {
        return Integer.compare(this.weight, other.weight);
    }
}

Duck[] ducks = { /* ... */ };
Arrays.sort(ducks);  // 使用 Duck 的 compareTo

四、本章小结

模板方法在父类中定义算法骨架,子类实现具体步骤。钩子方法提供可选的扩展点。好莱坞原则实现控制反转。


五、思考与练习

模板方法如何体现控制反转?

钩子方法有什么用途?

模板方法和策略模式如何选择?

为什么模板方法通常是 final 的?

模板方法在框架中如何应用?


8/12模板方法
0%