模板方式模式:
模板方法模式(Template Method Pattern)是属于行为型的设计模式,它在抽象类中定义了一个算法的骨架,让子类实现具体行为,而不改变算法的整体结构。这种模式让子类在不修改父类核心逻辑的情况下,重新定义子类步骤的行为。
角色和结构:
1 AbstractClass(抽象类):
- 定义了算法的框架,由一系列的方法组成,这些方法可以是具体方法(已实现),也可以是抽象方法(未实现,留给子类去实现)。
- 其中最重要的是一个模板方法(Template Method),这个方法定义了算法的骨架,调用了一系列基本方法来完成整个算法流程。
2 ConcreteClass(具体类):
- 继承自 AbstractClass 的具体子类,必须实现父类中声明的所有抽象方法。
- 子类可以通过重写父类中的钩子方法(Hook Method)来对算法的不同步骤进行定制化处理。
工作原理:
- 模板方法是一个受保护或公开的抽象方法,在该方法中定义了算法的各个步骤以及执行顺序。
- 可以是抽象方法或具体方法,它们代表了算法的原子操作,可能由抽象类或者子类实现。
示例代码:
模板方式模式的java示例代码如下:
// 抽象类:定义模板方法和基本方法
abstract class AbstractCook {
// 模板方法
public final void makeMeal() {
prepareIngredients();
cookFood();
serveFood();
}
// 基本方法
abstract void prepareIngredients();
// 基本方法
abstract void cookFood();
// 具体方法
void serveFood() {
System.out.println("Serving the food...");
}
}
// 具体类:实现抽象类中的抽象方法
class ChineseCook extends AbstractCook {
@Override
void prepareIngredients() {
System.out.println("Preparing Chinese ingredients...");
}
@Override
void cookFood() {
System.out.println("Cooking Chinese food...");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
AbstractCook cook = new ChineseCook();
cook.makeMeal();
}
}
说明:在上面代码中AbstractCook
类定义了一个做菜的模板方法 makeMeal()
,其中包含了三个步骤:准备食材、煮食物和上菜。而 ChineseCook
类作为具体子类实现了 prepareIngredients()
和 cookFood()
这两个基本方法,从而完成了中式菜肴的制作流程。
优点:
- 提高代码复用性:将相同的部分提取到抽象类中,不同的部分由子类实现。
- 分离关注点:将算法的不变部分与可变部分分离,使得算法结构更加清晰。
- 简化子类的设计:子类只需要关心需要变化的步骤,不需要了解算法的整体结构。
应用场景:
- 当多个类包含相同的算法实现,但每个类都有一些步骤不同时。