模板设计模式(Template Pattern)是一种行为设计模式,在软件设计中有着广泛的应用,旨在提高代码的可维护性和可复用性。
一、定义与特点
-
定义:
- 模板设计模式定义了一个算法的骨架,将某些步骤推迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
-
特点:
- 定义算法骨架:在抽象类中定义一个算法的框架,即算法的骨架。
- 具体步骤延迟到子类:将一些步骤的具体实现延迟到子类中,使得子类可以灵活地重新定义这些步骤。
二、结构与角色
-
抽象类(AbstractClass):
- 实现了模板方法,定义了算法的骨架。
- 包含了一些具体方法(有默认实现)和抽象方法(由子类实现)。
-
具体类(ConcreteClass):
- 实现抽象类中的抽象方法,完成完整的算法。
三、举例
以下是一个关于咖啡和茶制备过程的例子,用于说明模板设计模式的应用:
1.创建一个抽象类Template,写了一个模版方法prepare,因为咖啡和茶制备过程:准备开水和倒进杯子这两个步骤都有并且一样所以直接提取出来放到模版中,因为煮的方法和添加的方法不同所以修饰为抽象类,要求子类继承重写实现。
public abstract class Template {
// 准备饮料
public void prepare() {
// 准备开水
System.out.println("准备开水");
// 煮
brew();
// 倒进杯子
System.out.println("倒进杯子");
// 添加调味品
addCondiments();
}
//抽象方法
public abstract void brew();
public abstract void addCondiments();
}
子类Coffee继承父类Template并重写父类的抽象方法
class Coffee extends Template {
@Override
public void brew() {
System.out.println("煮咖啡");
}
@Override
public void addCondiments() {
System.out.println("加糖和牛奶");
}
}
子类Tea继承父类Template并重写父类的抽象方法
class Tea extends Template {
@Override
public void brew() {
System.out.println("泡茶");
}
@Override
public void addCondiments() {
System.out.println("加柠檬");
}
}
最后编写测试类,创建子类对象分别调用父类的模版方法prepare
class Test {
public static void main(String[] args) {
Template coffee = new Coffee();
coffee.prepare();
System.out.println("=====================");
Template tea = new Tea();
tea.prepare();
}
}
抽象类Template也可以这样写(将子类中公共的代码块进行封装并在prepare方法中调用):
public abstract class Template {
// 准备饮料
public void prepare() {
// 准备开水
boilWater();
// 煮
brew();
// 倒进杯子
pourInCup();
// 添加调味品
addCondiments();
}
public abstract void brew();
public abstract void addCondiments();
public void boilWater() {
System.out.println("准备开水");
}
public void pourInCup() {
System.out.println("倒进杯子");
}
}
四、模板设计步骤:
1.创建一个抽象类作为父类并创建一个模版方法,将子类中公共的代码块进行封装并在模版方法中调用
2.将子类特有的代码块封装成抽象的方法并在模版方法中调用
3.子类分别重写父类的抽象方法
4.在测试类中分别创建子类对象再调用父类的模版方法
示意图:
五、应用场景
- 算法框架固定,但具体步骤可能有变化:当多个类有相似的行为,但其中一些细节不同时,可以使用模板设计模式。
- 代码复用:通过将共同的行为放在一个抽象类的模板方法中,可以避免代码的重复。
- 框架设计:在框架设计中,模板模式经常用于定义框架的骨架和流程。
- 生命周期管理:在对象的生命周期管理中,模板模式可以确保某些过程按照一定的顺序执行。
- GUI应用中的事件处理:模板模式可以用于定义事件处理的框架。
- 数据库操作:在数据库操作中,可以使用模板模式来定义一些通用的步骤。
综上所述,模板设计模式是一种非常有用的设计模式,它可以帮助我们提高代码的可维护性和可复用性。通过定义一个算法的骨架,并将某些步骤推迟到子类中实现,我们可以在不改变算法结构的情况下,灵活地重新定义算法中的某些步骤。