前言
其他行为型模式:
在介绍模板方法Template Method之前,我们了解一个概念:
什么是卡榫函数?
「卡榫(Hook)」,就是用来接合两个东西的接口。如果两个东西于不同时间出现,则一方会预留虚空,给予另一边于未来时刻能以实体来填补该空间,两者虚实相依,就密合起来了。设计优良的卡榫,可以让实体易于新陈代谢、抽换自如(Plug and Play, 俗称PnP)。
- 变与不变的分离(Separate code that changes from the code that doesn’t)是设计卡榫(Hook)函数及应用框架之基本原则和手艺。
- 分离出变(Variant)与不变(Invariant)部份之后,就可以将不变部份写在父类别(Super-class)里,而变的部份就写在子类别(Subclass)里。
而模板方法就是使用抽象函数来实现卡榫函数的。
1. 意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2. 适用性
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为被提取出来,集中到一个公共父类中以避免代码重复。
- 控制子类的扩展。
3. 参与者
- AbstractClass(抽象类) 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤。
- ConcreteClass(具体类)——实现原语操作以完成算法中与特定子类相关的步骤。
4. 效果
模板方法是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。
模板方法导致一种反向的控制结构IOC,这种结构被称为“好莱坞法则”,即“别找我们,我们找你”。这指的是一个父类调用一个子类的操作,而不是相反。
5. 实例
模板方法可以说是最常见、使用频率也足够高的一个模式了,因为它带来的复用性实在是太强了,不仅简化我们代码的结构,清晰了我们的业务逻辑,而且减少了代码的冗余,又能在一定程度上达到耦合松散的目的。
模板方法的例子不仅体现在我们平时的代码中,实际生活中其实也都可以见到,下面我们以一道菜西红柿炒鸡蛋为例来讲解这个模式。
看到这里别饿啊。偷笑:)
不管你们会不会做饭,我们先来严肃的理性的分析一下,一盘西红柿炒鸡蛋是怎么诞生的?
好了,我们分析完番茄炒蛋的做法之后,我们再来回顾模板方法的概念:
模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
其核心一点:就是把操作中的不变的算法给抽象出来。
那么我们针对“番茄炒蛋”抽象一下:
不变的部分:放入鸡蛋和西红柿
变化的部分:就是香菜!(有些人吃香菜而有些人不吃)
public abstract class TomatoWithEgg {
/**
* 放入香菜
*/
abstract void addCilantro();
private void addEggs() {
System.out.println("放入鸡蛋");
}
private void addTomato() {
System.out.println("放入西红柿");
}
private void addFlavour() {
System.out.println("放入盐和糖");
}
/**
* 完成
*/
public void complete() {
addEggs();
addTomato();
addFlavour();
addCilantro();
}
}
然后我们来找一个厨师来做这道菜,然后客人的要求呢是要放香菜的:
public class Cook extends TomatoWithEgg {
@Override
void addCilantro() {
System.out.println("放入香菜");
}
}
最后我们来测试一下:
private static void testTemplateMethod() {
Cook cook = new Cook();
cook.complete();
}
网友评论