设计模式之模板方法模式

简介: 本篇文章是设计模式专题的第九篇文章,我会将遇到的设计模式都一一总结在该专题下,我会把自己对每一种设计模式的感悟写下来,以及在实际工作中我们该如何去灵活应用这些设计模式,欢迎大家关注。本篇文章我们就来讲一讲模板方法模式。

## 模板方法模式的简单介绍

模板方法模式是行为型模式的一种,用来定义一个操作中的算法骨架。

如何去理解算法骨架呢?也就是说我们在设计这个算法的时候,就清晰的知道了算法所需要的关键步骤,而且确定了这些步骤的执行顺序,但是某些具体的步骤无法确定,或者是具体的步骤需要根据场景做调整

模板方法其实更强调于因地制宜,同样的一个方法,不同场景得到的结果是不一样的。

最简单的语言描述,就是通过模板方法去调用一系列的子方法,子方法可以定义为抽象方法,可以交给不同的子类去实现,从而实现高度的可扩展性。

模板方法模式的类图:

image.png

模板方法模式的具体实现思路

  • 通过抽象类定义共性的方法,特性的方法通过抽象方法表示,定义模板方法(算法骨架)。
  • 通过不同的子类实现差异化。
  • 模板方法中可以通过钩子函数增加灵活性。

模板方法模式的具体实现方案

// 抽象类
public abstract class AbstractTemplate {
    // 模板方法
    // 为防止恶意操作,一般情况下模板方法都加上final关键词。
    public final void templateMethod() {
        // 这几个方法的调用及顺序构成算法骨架
        // 抽象方法(特异性方法)
        abstractMethod1();
        // 钩子函数
        HookMethod1();
        if (HookMethod2()) {
            // 公共方法
            SpecificMethod();
        }
        // 抽象方法
        abstractMethod2();
    }
    // 具体方法,将共性的实现交由抽象类实现
    public void specificMethod() {
        // 具体逻辑
    }
    // 钩子方法也可以在抽象类中实现,然后通过子类改写
    // 钩子方法1
    public void HookMethod1() {
    }
    // 钩子方法2
    public boolean HookMethod2() {
        return true;
    }
    // 抽象方法1
    public abstract void abstractMethod1();
    // 抽象方法2
    public abstract void abstractMethod2();
}
​
// 具体实现类
public class ConcreteTemplate extends AbstractTemplate {
    @Override
    public void abstractMethod1() {
        // 具体实现
    }
    @Override
    public void abstractMethod2() {
        // 具体实现
    }
    // 方法重写
    @Override
    public void hookMethod1() {
        // 具体实现
    }
    // 方法重写
    @Override
    public boolean hookMethod2() {
        return false;
    }
}

模板方法模式的优缺点

优点

  • 封装了不变部分,扩展可变部分。
  • 提取了公共的部分代码,便于代码复用。
  • 通过增加子类可以很好的扩展算法,符合开闭原则。

缺点

  • 对于不同的实现都需要增加一个子类,这会导致系统的类增多
  • 模板方法模式设计更加抽象,增加了系统实现的复杂度。
  • 通过子类方法影响父类方法,这导致一种反向的控制结构,它提高了代码阅读的难度。
  • 基于继承关系自身的特点,父类添加新的抽象方法,所有子类都需要同步修改一遍。

模板方法模式的适用场景

  1. 算法的整体步骤很固定,但是其中一些方法需要根据场景不同,进行不同的实现,我们就可以将易变的抽象出来,交由子类实现。
  2. 当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。
  3. 当需要控制子类的扩展部分是否执行时,可以在特定的方法前调用钩子操作,这样就增强了模板方法的灵活性。

模板方法模式总结

模板方法模式注重解决的问题是复杂算法,固定算法套路,场景不同实现不同。遇到这三个特点的场景,我们就可以考虑使用模板方法去实现或者是优化重构。

Spring中的AbstractApplicationContext中的refresh()就是模板方法模式。

目录
相关文章
|
6月前
|
设计模式 算法
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
|
设计模式 存储 算法
行为型设计模式02-模板方法模式
行为型设计模式02-模板方法模式
50 0
|
设计模式 算法
设计模式9 - 模板方法模式【Template Method Pattern】
设计模式9 - 模板方法模式【Template Method Pattern】
37 0
|
设计模式 算法 Java
设计模式~模板方法模式(Template method)-10
目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: (6)Servlet Api &
58 0
|
2月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
4月前
|
设计模式 JavaScript 算法
js设计模式【详解】—— 模板方法模式
js设计模式【详解】—— 模板方法模式
48 6
|
5月前
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
174 0
|
6月前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
60 1
|
6月前
|
设计模式 Go
[设计模式 Go实现] 行为型~模板方法模式
[设计模式 Go实现] 行为型~模板方法模式
|
6月前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    49
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    58
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    110
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78
  • 下一篇
    无影云桌面