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

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

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. }

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

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

相关文章
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
113 16
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
108 16
【设计模式】【行为型模式】备忘录模式(Memento)
一、入门 什么是备忘录模式? 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作
93 8
【设计模式】【行为型模式】命令模式(Command)
一、入门 什么是命令模式? 命令模式是一种行为设计模式,它将请求或操作封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录、撤销等操作。 命令模式的核心是将“请求”封装为独立的
128 15
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
69 14
【设计模式】【行为型模式】解释器模式(Interpreter)
一、入门 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义语言的语法表示,并提供一个解释器来处理该语法。它通常用于需要解释和执行特定语言或表达式的场
73 11
【设计模式】【行为型模式】迭代器模式(Iterator)
一、入门 什么是迭代器模式? 迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问聚合对象中元素的方法,而不需要暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出
82 11
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
77 13
|
2月前
|
【设计模式】【行为型模式】访问者模式(Visitor)
一、入门 什么是访问者模式? 访问者模式(Visitor Pattern)是一种行为设计模式,允许你将算法与对象结构分离。通过这种方式,可以在不改变对象结构的情况下,向对象结构中的元素添加新的操作。
95 10
【设计模式】【行为型模式】中介者模式(Mediator)
一、入门 什么是中介者模式? 中介者模式(Mediator Pattern)是一种行为设计模式,旨在减少对象之间的直接依赖,通过引入一个中介者对象来协调多个对象之间的交互。这种模式特别适用于对象间存在
82 9

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问