在模板方法模式(TemplateMethod Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

大话设计模式中程杰老师给出的定义是:模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

有一个经常用到的实例就是Spirng 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,我们不必重复写那些已经规范好的代码,直接给出一个实体就可以保存。

模板方法模式的结构图如下:

代码示例如下:

AbstractClass抽象类其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑组成步骤在相应的抽象操作中,推迟到子类实现;顶级逻辑也有可能去调用一些具体方法。

//抽象类,实现了一些模板方法
public class abstract AbstractClass{//一些抽象行为,放到子类中其实现public abstract void PrimitiveOperation1();public abstract void PrimitiveOperation2();//模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类中去实现public final void TemplatMethod(){initialize();PrimitiveOperation1();PrimitiveOperation2();}}

ConcreteClass类实现父类所定义的一个或者多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之相对应,而每一个ConcreteClass都可以给出这些抽象方法的不同实现(也就是顶级逻辑组成步骤的不同实现),从而使得顶级逻辑的实现各不相同。

注意ConcreteClass类中方法的顺序和模板类中方法的顺序,具体的逻辑实现顺序至于模板中定义的逻辑顺序有关系。

//抽象类的某个实现类A
public Class ConcreteClassA extends AbstractClass{@overridepublic void PrimitiveOperation2(){System.out.println("类A具体实现方法2");}@Overridepublic void initialize() {System.out.println("CocreteClassA Initialized");}@overridepublic void PrimitiveOperation1(){System.out.println("类A具体实现方法1");}}
//抽象类的某个实现类B
public Class ConcreteClassB extends AbstractClass{@overridepublic void PrimitiveOperation2(){System.out.println("类B具体实现方法2");}@Overridepublic void initialize() {System.out.println("CocreteClassB Initialized");}@overridepublic void PrimitiveOperation1(){System.out.println("类B具体实现方法1");}}
//测试方法
public static void main(String[] args){AbstractClass ac;ac = new ConcreteClassA();ac.TemplatMethod();ac = new ConcreteClassB();ac.TemplatMethod();}

运行结果:

CocreteClassA Initialized
类A具体实现方法1
类A具体实现方法2CocreteClassB Initialized
类B具体实现方法1
类B具体实现方法2

模板方法模式的特点:

1、模板方法模式是通过把不变行为搬移到超类中,去除子类中的重复代码来体现它的优势;

2、模板方法模式就是提供了一个很好的代码复用平台;有时候我们会遇到一系列步骤构成的过程需要执行,这个过程从高层次上看是相同的,但是有些步骤的实现可能不同。

3、当不变的和可变的行为在方法子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就可以帮助子类摆脱重复的不变行为的纠缠。

优点:

1、封装不变部分,扩展可变部分。

2、提取公共代码,便于维护。

3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景:

1、有多个子类共有的方法,且逻辑相同。

2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。

大话设计模式—模板方法模式相关推荐

  1. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  2. 大话设计模式:模板方法模式

    一.什么是模板方法模式 算法骨架的封装 使用一个算法骨架,确定算法流程,具体步骤可变化的部分交给子类实现,这样子类就可以不改变算法骨架流程,重定义部分具体步骤的实现. UML图 AbstractTem ...

  3. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  4. 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式

        前段时间学习了一些设计模式,最近在做项目的过程中恰巧用到了其中的一个--模板方法模式.这个模式在程序设计过程中可是为小编省去了不少的代码量呢.具体是怎样应用的呢?接下来小编为您分享. 前面博文 ...

  5. 『设计模式』瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)

    23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...

  6. 『设计模式』设计模式--模板方法模式

    23种设计模式+额外常用设计模式汇总 (持续更新) 简介 Define the skeleton of an algorithm in an operation,deferring some step ...

  7. 行为型设计模式---模板方法模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  8. Java设计模式-模板方法模式详解

    Java设计模式-模板方法模式 文章目录 Java设计模式-模板方法模式 0.前言 1.模板方法原理 2.模板方法模式中的角色 3.模板方法模式的UML类图 4.代码实现 5.编码测试 6.模板模式中 ...

  9. Java设计模式 - 模板方法模式

    Java设计模式 - 模板方法模式 定义一个算法的骨架,并将一些步骤通过子类表达. UML图示 要点 1. 定义一个算法的骨架 - 建立一个抽象类 2. 将一些步骤通过子类表达 - 子类继承抽象类 赋 ...

最新文章

  1. mysql 字段扩容_解决DB2事物日志满、扩充表字段长度和表空间的命令
  2. wordpress关闭博客评论的两种方法
  3. 自定义变量 配置文件_「系统架构」Nginx调优之变量的使用(3)
  4. VS2013找不到winres.h的解决办法
  5. native封装卡片 react_自己动手封装一个React Native多级联动
  6. PyTorch入门-深度学习回顾和PyTorch简介
  7. CodeForces413E Maze 2D
  8. PyTorch:损失函数loss function
  9. 游戏贪吃蛇计分c语言,C语言实现贪吃蛇游戏(命令行)
  10. Tue Feb 23 2021 00:00:00 GMT+0800 (中国标准时间)时间格式转换
  11. 小A与小姐姐给气球涂色 题目描述 小A与小姐姐闲的无聊,它们路过一家商店,看见里面有很多无色的气球,于是他们突然有一
  12. Php 实现在文档只读功能,如何将只读文档变成可编辑模式?
  13. x264参数与代码对应
  14. 使用Blender导出多个动画的GLTF模型
  15. pion实现录制WebRTC流
  16. 网易考拉海购Dubbok框架优化详解(学习笔记)
  17. 【元胞自动机】元胞自动机交通事故通行【含Matlab源码 1345期】
  18. ubuntu14.04下设置静态IP
  19. Python小游戏——外星人入侵(保姆级教程)第一章 06让飞船移动
  20. 干货 :建立软件的经济学分析框架,浅议开源软件的经济学特性(附图解)

热门文章

  1. 2012-11-9到2012-12-8
  2. eclipse中查看android源码
  3. IIS 支持 php
  4. android杀掉进程顺序
  5. Android事件处理机制
  6. Java方法 signature
  7. 《机器学习导论》和《统计机器学习》学习资料:张志华教授
  8. HDU 6264 Super-palindrome
  9. tp3.2 复合查询
  10. Observer(订阅与发布)