软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理
一、简介
模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern), 它是一种行为设计模式, 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。
角色:
- 抽象类(Abstract Class):抽象类定义了算法的框架,其中包含一个或多个抽象方法和模板方法。抽象方法用于延迟到子类实现的具体步骤,而模板方法定义了算法的框架,其中包含一系列的步骤,这些步骤可以是具体方法或抽象方法。
- 具体类(Concrete Class):具体类是抽象类的子类,它实现了抽象方法,完成算法的具体步骤。
二、实例
文件处理,公共下载和公共读取,特定处理数据。
1、模板抽象类(AbstractTemplate)
代码语言:javascript复制@Slf4j
public abstract class AbstractTemplate {
public void execute(String filePath) {
download(filePath);
read(filePath);
deal(filePath);
}
public void download(String filePath) {
log.info("公共下载:{}", filePath);
}
public void read(String filePath) {
log.info("公共读取:{}", filePath);
}
public abstract void deal(String filePath);
}
2、文件服务类1(OneFileService )
代码语言:javascript复制@Slf4j
public class OneFileService extends AbstractTemplate {
@Override
public void deal(String filePath) {
log.info("OneFileService 处理数据:{}", filePath);
}
}
3、文件服务类2(TwoFileService )
代码语言:javascript复制@Slf4j
public class TwoFileService extends AbstractTemplate {
@Override
public void deal(String filePath) {
log.info("TwoFileService 处理数据:{}", filePath);
}
}
4、测试类(Main)
代码语言:javascript复制public class Main {
public static void main(String[] args) {
OneFileService oneFileService = new OneFileService();
oneFileService.execute("D:\test.txt");
}
}
5、后台输出
代码语言:javascript复制公共下载:D:test.txt
公共读取:D:test.txt
OneFileService 处理数据:D:test.txt
三、总结
1、优点
- 固定的算法框架,降低了算法的设计和实现的复杂度。
- 提供了一种简单的扩展和定制算法的方式,通过子类可以灵活地实现算法中的具体步骤,同时保持了算法的整体结构的稳定性。
- 通过抽象父类和具体子类的分离,提高了代码的可维护性和可复用性,减少了重复代码的编写。
2、缺点
- 如果模板方法本身需要的改动较多,可能需要修改抽象父类或者大量的子类,导致系统的扩展性变差。
- 如果算法的步骤太多或者过于复杂,可能会导致模板方法变得庞大,不易维护。
3、应用场景
- 算法的结构固定,但是某些具体步骤的实现可能变化。
- 多个类具有相似的行为。
- 需要控制算法的执行流程。
- 提供一个框架或工具的扩展点。