设计模式-行为型模式:模板方法模式

简介: 设计模式-行为型模式:模板方法模式

1、简介

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法的骨架,将一些步骤延迟到子类中实现。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法模式的主要思想是将一个算法的骨架放在父类中实现,而将具体的实现细节交给子类去实现。这样可以保证算法的结构不变,而只需要修改子类中的具体实现细节即可实现算法的变化。这种模式的关键在于抽象类中定义了一个模板方法,该方法定义了算法的骨架,并且在其中调用了一些抽象方法或者具体方法,这些方法在子类中具体实现。

2、组成部分

模板方法模式有以下组成部分:

  1. 抽象类(Abstract Class):定义模板方法和抽象方法,通常用于描述算法的框架和定义基本操作的执行顺序。抽象类中的模板方法可以是具体方法、抽象方法或钩子方法。
  2. 具体类(Concrete Class):继承抽象类并实现抽象方法,以完成算法的具体步骤。具体类中的实现可以改变算法的某些步骤,但是不能改变算法的整体结构。
  3. 模板方法(Template Method):定义算法的框架,通常由一系列调用基本操作的步骤组成,可以是抽象方法、具体方法或钩子方法。模板方法通常被声明为 final,以防止子类修改算法的整体结构。
  4. 基本操作(Primitive Operation):定义算法中的基本步骤,通常由抽象方法实现。基本操作可以是模板方法中的具体方法或抽象方法,由具体类来实现。
  5. 钩子方法(Hook Method):在模板方法中声明但没有实现的方法,通常用于控制算法的流程或提供算法的扩展点。钩子方法通常由具体类来实现。

模板方法模式的核心思想是将算法的框架固定下来,将可变的部分留给子类实现。通过使用模板方法模式,可以避免代码重复,提高代码复用性和可维护性,并且使代码更加灵活和可扩展。

3、优缺点

模板方法模式是一种常用的设计模式,它具有以下优点和缺点:

优点:

  1. 提高代码复用性:模板方法模式将一些通用的代码实现放在抽象类中,可以在不改变算法结构的情况下重用这些代码,避免了重复编写相似的代码。
  2. 降低耦合度:模板方法模式将算法骨架和具体实现分离,使得子类只需要关注具体实现而不必关心算法的结构,从而降低了类之间的耦合度。
  3. 可扩展性好:模板方法模式中的抽象类定义了算法的骨架,可以方便地扩展新的子类,实现新的具体算法。
  4. 便于维护:模板方法模式中将算法骨架和具体实现分离,使得修改算法骨架和修改具体实现互不干扰,更加方便维护和修改。

缺点:

  1. 代码复杂度高:模板方法模式中的抽象类和具体子类的数量增加了代码的复杂度,增加了代码阅读和维护的难度。
  2. 继承关系固定:模板方法模式中,抽象类定义了算法骨架,具体子类必须按照抽象类定义的算法骨架去实现具体方法,如果抽象类的算法骨架需要修改,则所有的具体子类都必须进行修改。
  3. 不利于单元测试:模板方法模式中的抽象类和具体子类需要进行集成测试,不利于单元测试。

总之,模板方法模式在设计框架、工具类等方面非常有用,但需要注意在具体业务代码中使用时,要注意其优缺点,并合理使用,避免出现代码复杂度高、维护成本高等问题。

4、使用场景

模板方法模式适用于以下场景:

  1. 有多个类实现相同的算法,但实现细节不同,使用模板方法模式可以避免代码重复,并保证算法结构的一致性。
  2. 需要控制算法的流程,确保每个步骤都按照指定的顺序执行,这时可以使用模板方法模式。
  3. 需要在不修改算法结构的情况下修改算法的具体实现,使用模板方法模式可以将算法结构和具体实现分离开来,方便修改和扩展。
  4. 在框架和工具类中使用较为广泛,例如JDK中的java.util.Collections.sort()方法、Spring框架中的JdbcTemplate、Hibernate框架中的HibernateTemplate等都使用了模板方法模式。

总之,模板方法模式适用于那些需要在多个类中重复使用相同算法流程,并且算法流程的步骤需要保持一致的情况下。

5、代码实现

下面是一个使用Java语言实现模板方法模式的示例:

首先定义一个抽象类,它包含一个模板方法和两个抽象方法:

1. public abstract class AbstractClass {
2. // 模板方法
3. public final void templateMethod() {
4.         primitiveOperation1();
5.         primitiveOperation2();
6.         hook();
7.     }
8. 
9. // 抽象方法1
10. public abstract void primitiveOperation1();
11. 
12. // 抽象方法2
13. public abstract void primitiveOperation2();
14. 
15. // 钩子方法
16. public void hook() {
17. // 默认实现为空,具体子类可以根据需要覆盖该方法
18.     }
19. }

接下来,我们定义两个具体类,它们继承自抽象类,并实现其抽象方法:

1. public class ConcreteClassA extends AbstractClass {
2. // 实现抽象方法1
3. public void primitiveOperation1() {
4.         System.out.println("ConcreteClassA primitiveOperation1");
5.     }
6. 
7. // 实现抽象方法2
8. public void primitiveOperation2() {
9.         System.out.println("ConcreteClassA primitiveOperation2");
10.     }
11. }
1. public class ConcreteClassB extends AbstractClass {
2. // 实现抽象方法1
3. public void primitiveOperation1() {
4.         System.out.println("ConcreteClassB primitiveOperation1");
5.     }
6. 
7. // 实现抽象方法2
8. public void primitiveOperation2() {
9.         System.out.println("ConcreteClassB primitiveOperation2");
10.     }
11. 
12. // 覆盖钩子方法
13. public void hook() {
14.         System.out.println("ConcreteClassB hook");
15.     }
16. }

在上面的代码中,我们可以看到,具体类继承了抽象类,并实现了其中的抽象方法。同时,具体类还可以根据需要覆盖钩子方法,以扩展算法的流程。

最后,我们可以编写一个客户端代码,用于测试我们的模板方法模式实现:

1. public class Client {
2. public static void main(String[] args) {
3. AbstractClass classA = new ConcreteClassA();
4.         classA.templateMethod();
5. 
6.         System.out.println();
7. 
8. AbstractClass classB = new ConcreteClassB();
9.         classB.templateMethod();
10.     }
11. }

在客户端代码中,我们创建了两个具体类的实例,并分别调用它们的模板方法。我们可以看到,由于模板方法在抽象类中定义,因此无论使用哪个具体类,算法的整体结构都是相同的,但是由于具体类实现了抽象方法和钩子方法,因此算法的具体步骤和扩展点可以有所不同。

总之,模板方法模式通过定义算法的框架和基本步骤,将算法的具体实现延迟到具体类中实现,提高了代码复用性和可维护性,并使代码更加灵活和可扩展。

相关文章
|
2月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
3月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
4月前
|
设计模式 算法 Java
【十六】设计模式~~~行为型模式~~~策略模式(Java)
文章详细介绍了策略模式(Strategy Pattern),这是一种对象行为型模式,用于定义一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法独立于使用它的客户而变化,提高了系统的灵活性和可扩展性。通过电影院售票系统中不同类型用户的打折策略案例,展示了策略模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和测试结果。
【十六】设计模式~~~行为型模式~~~策略模式(Java)
|
4月前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
4月前
|
设计模式 存储 前端开发
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
文章详细介绍了观察者模式(Observer Pattern),这是一种对象行为型模式,用于建立对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。文中通过交通信号灯与汽车的案例以及多人联机对战游戏的设计方案,阐述了观察者模式的动机和应用场景。接着,文章介绍了观察者模式的结构、角色、优点、缺点以及适用情况,并通过代码示例展示了如何在Java中实现观察者模式。此外,还探讨了观察者模式在MVC架构中的应用以及Java中对观察者模式的支持。
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
|
4月前
|
设计模式 前端开发 Java
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
文章详细介绍了中介者模式(Mediator Pattern),这是一种对象行为型模式,用于封装一系列对象的交互,降低系统耦合度,并简化对象之间的交互关系。通过案例分析、结构图、时序图和代码示例,文章展示了中介者模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
|
4月前
|
设计模式 安全 Go
[设计模式]行为型模式-观察者模式
[设计模式]行为型模式-观察者模式
|
4月前
|
设计模式 存储 Java
【十二】设计模式~~~行为型模式~~~命令模式(Java)
文章详细介绍了命令模式(Command Pattern),这是一种对象行为型模式,用于将请求封装成对象,实现请求发送者与接收者的解耦,从而降低系统耦合度、提高灵活性,并支持命令的排队、记录、撤销和恢复操作。通过案例分析、结构图、时序图和代码示例,文章展示了命令模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
|
4月前
|
设计模式 算法 测试技术
[设计模式]行为型模式-策略模式
[设计模式]行为型模式-策略模式
|
5月前
|
设计模式 JavaScript 算法
js设计模式【详解】—— 模板方法模式
js设计模式【详解】—— 模板方法模式
48 6