从JDK中学习设计模式——模板方法模式

这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

概述

模板方法模式(Template Method Pattern)定义一个操作中算法的框架,而将一些步骤延迟到子类中,使子类可以在不改变算法结构的情况下,重新定义该算法的某些特定步骤。因此,模板方法模式是一种基于继承的代码复用技术,属于类行为型模式。

结构

模板方法模式UML.png

  • AbstractClass(抽象类):一般是抽象类或接口,其中定义了算法的框架(模板方法)和一系列基本操作(基本方法)。在模板方法中,可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其它对象中的方法。基本方法可以是具体的,也可以是抽象的,在其子类中可以重定义或实现这些方法。
  • ConcreteClass(具体子类):用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

优点

  1. 在父类中定义算法的框架,在子类中实现具体的步骤,降低了系统的耦合度
  2. 通过父类可以调用子类的操作,通过对子类的扩展可以增加新的行为,符合开闭原则
  3. 通过继承实现了代码的复用,可以将公共行为放在父类中,然后通过子类来实现不同的行为。
  4. 实现了反向控制结构,可以通过子类覆盖父类的钩子方法来决定某一特定步骤是否执行。

缺点

  1. 增加了系统中类的数量,提升了系统的复杂度。
  2. 子类执行的结果会影响父类的结果,降低了代码的可读性。

应用场景

  1. 多个子类有公有的方法,并且逻辑基本相同,可以将公共的行为提取出来,集中到公共父类中,可以避免代码的重复。
  2. 重要、复杂的算法,可以把核心算法设计为模板方法,相关的细节功能则由子类实现。
  3. 子类可以决定父类中的某个步骤是否执行,实现子类对父类的反向控制。

JDK 中的应用

在 JDK 中,在以下类中都使用了模板方法模式:

  • java.util.Collections#sort()
  • java.io.InputStream#skip()
  • java.io.InputStream#read()
  • java.util.AbstractList#indexOf()
  • java.io.InputStream / java.io.OutputStream 的所有非抽象方法
  • java.io.Reader / java.io.Writer 的所有非抽象方法
  • java.util.AbstractList / java.util.AbstractSet / java.util.AbstractMap 的所有非抽象方法

おすすめ

転載: juejin.im/post/7035637626505789453