在模板模式中,一个抽象类公开定义了执行它的方法的方式。它的子类可以按照重写方法实现,但调用将以抽象类中定义的方法进行。这种类型的设计模式属于行为型模式。
介绍
意图:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法子类可以不改变算法的结构即可重定义该算法的某些步骤。
关键代码:在抽象类实现,其他步骤在子类实现
优点:
- 封装不变部分,扩展可变部分
- 提取公共代码便于维护
- 行为有父类控制子类实现
缺点:
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景:
- 有多个子类共有方法,且逻辑相同
- 重要的、复杂的方法,可以考虑作为模板方法
注意事项:为了防止恶意操作,一般模板方法上都加上final关键字
实现
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。

步骤1
创建一个抽象类,它的模板方法被设置为 final。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package class类.模板设计模式;
public abstract class 春晚小品 { abstract void 开场(); abstract void 叙事(); abstract void 煽情(); abstract void 谢幕();
public final void 演小品(){ 开场(); 叙事(); 煽情(); 谢幕(); } }
|
步骤2
创建扩展了上述类的实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package class类.模板设计模式;
public class 冯巩 extends 春晚小品{ @Override void 开场() { System.out.println("朋友们想死你们了"); }
@Override void 叙事() { System.out.println("冯巩叙事"); }
@Override void 煽情() { System.out.println("冯巩煽情"); }
@Override void 谢幕() { System.out.println("冯巩谢幕"); }
}
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13
| package class类.模板设计模式;
public class Test { @org.junit.Test public void test() { 春晚小品 冯巩 = new 冯巩(); 冯巩.演小品(); } }
|
