Java 设计模式系列(十三)模板方法

Java 设计模式系列(十三)模板方法

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

一、模板方法的结构

图13-1 模板方法的结构

  • AbstractClass:抽象类。用来定义算法骨架和原语操作,具体的子类通过重定义这些原语操作来实现一个算法的各个步骤。在这个类里面,还可以提供算法中通用的实现。

  • ConcreteClass:具体实现类。用来实现算法骨架中的某些步骤,完成跟特定子类相关的功能。

源代码

(1) 抽象模板角色类

1/** 2 * 定义模板方法、原语操作等的抽象类 3 */ 4public abstract class AbstractTemplate { 5 /** 原语操作1,所谓原语操作就是抽象的操作,必须要由子类提供实现 */ 6 public abstract void doPrimitiveOperation1(); 7 8 /** 原语操作2 */ 9 public abstract void doPrimitiveOperation2(); 10 11 /** 模板方法,定义算法骨架 */ 12 public final void templateMethod() { 13 doPrimitiveOperation1(); 14 doPrimitiveOperation2(); 15 } 16}

(2) 具体模板角色类

1/** 2 * 具体实现类,实现原语操作 3 */ 4public class ConcreteTemplate extends AbstractTemplate { 5 public void doPrimitiveOperation1() { 6 //具体的实现 7 } 8 public void doPrimitiveOperation2() { 9 //具体的实现 10 } 11}

模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。

每当定义一个新的子类时,不要按照控制流程的思路去想,而应当按照“责任”的思路去想。换言之,应当考虑哪些操作是必须置换掉的,哪些操作是可以置换掉的,以及哪些操作是不可以置换掉的。使用模板模式可以使这些责任变得清晰。

二、总结

模板方法中的方法可以分为两大类:模板方法和基本方法。

(1) 模板方法

一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。

一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。

(2) 基本方法

基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

  • 抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在Java语言里抽象方法以abstract关键字标示。

  • 具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。

  • 钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。


每天用心记录一点点。内容也许不重要,但习惯很重要!

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java 设计模式之模板模式

什么是模板模式模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。模板方法模式的结构抽象类(AbstractClass):

Android模板设计模式之 - 构建整个应用的BaseActivity

1\.模式介绍模式的定义定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。所有分享大纲:视频讲解地址:模式的使用场景1.多个子类有公有的方法,并且逻辑基本相同时。2.重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。3.重构时,模板方法模式

Dart中的抽象类、多态、以及接口

一、Dart中的抽象类Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。  1、抽象类通过abstract 关键字来定义  2、Dart中的抽象方法不能用abstract声明

Django框架详解之template

模板简介  将页面的设计和python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统来实现这种模式  python的模板:HTML代码模板语法  模板包括在使用时会被值替换掉的变量,和控制模板逻辑的标签变量  在Django模板中遍历复杂数据结构的关键是句点字符{语法}{{

Java日期时间API系列30

  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用

Java 设计模式系列(十三)模板方法 - HelloWorld