Java设计模式——模版方法模式
一、模板方法模式概述
模板方法模式(Template Method Pattern)是极为常见的设计模式之一。在实际开发中,开发者可能已经在不经意间使用了该模式。此模式需要抽象类与具体子类协同工作:抽象类用于勾勒算法的轮廓和骨架,具体子类则负责填充算法中的各个逻辑步骤。不同子类的填充方式各异,但整体流程保持一致。汇总这些基本方法的方法被称为模板方法,它在抽象类中以具体方法的形式定义。
二、模式角色
模板方法模式主要涉及以下两个核心角色:
1. 抽象模板角色(Abstract Class)
- 定义基本操作:定义一个或多个抽象操作,这些操作是顶级逻辑的组成步骤,被称为基本方法(Primitive Operations)。
- 实现模板方法:定义并实现一个模板方法。此方法给出顶级逻辑的骨架,调用上述基本方法,而逻辑的具体实现则推迟到子类中完成。
2. 具体模板角色(Concrete Class)
- 实现抽象方法:实现父类中定义的一个或多个抽象方法。
- 差异化实现:不同的具体子类可以为这些抽象方法提供不同的实现,从而使顶级逻辑的具体执行过程各不相同,但整体流程受模板方法控制。
三、代码示例
为了更清晰地说明该模式,我们使用一个经典的“制作饮品”案例。假设制作咖啡和制作茶都有不变的步骤:烧水、冲泡、倒入杯中、添加调料。这些步骤构成了模板方法,而具体的冲泡方式和添加的调料则因饮品不同而异。
以下是相关代码实现:
/**
* 抽象模板角色:定义饮品制作的骨架
* 将制作饮品必须遵循的步骤抽象成一个顶级逻辑
*/
public abstract class AbstractBeverage {
// 模板方法:定义算法骨架
public final void makeBeverage() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 基本方法:具体实现由子类提供
public abstract void brew();
public abstract void addCondiments();
// 具体方法:子类通用的步骤
public void boilWater() {
System.out.println("烧水...");
}
public void pourInCup() {
System.out.println("倒入杯中...");
}
}
/**
* 具体模板角色:咖啡
*/
public class Coffee extends AbstractBeverage {
@Override
public void brew() {
System.out.println("用沸水冲泡咖啡粉...");
}
@Override
public void addCondiments() {
System.out.println("添加糖和牛奶...");
}
}
/**
* 具体模板角色:茶
*/
public class Tea extends AbstractBeverage {
@Override
public void brew() {
System.out.println("用沸水浸泡茶叶...");
}
@Override
public void addCondiments() {
System.out.println("添加柠檬...");
}
}客户端调用代码如下:
public class Client {
public static void main(String[] args) {
// 制作咖啡
AbstractBeverage coffee = new Coffee();
coffee.makeBeverage();
System.out.println("-------------");
// 制作茶
AbstractBeverage tea = new Tea();
tea.makeBeverage();
}
}四、总结
模板方法模式的核心在于准备一个抽象类,在其中将部分逻辑以具体方法实现,同时声明一些抽象方法迫使子类实现剩余逻辑。不同子类可以通过不同方式实现这些抽象方法,从而实现剩余逻辑的多样化。
通过这种方式,代码结构更加清晰,具有更好的扩展性和可维护性,能够适应不同场景下的需求变化。它符合“开闭原则”,即对扩展开放,对修改关闭。
说明:本文内容基于经典设计模式理论,适用于 Java 及大多数面向对象编程语言。文中术语已统一为标准译名“模板方法模式”(原稿中混用了“模版”)。示例代码已调整为通用技术案例,以便于理解与维护。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/java-she-ji-mo-shi--mo-ban-fang-fa-mo-shi.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。