博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一看就懂的设计模式--模板方法
阅读量:2391 次
发布时间:2019-05-10

本文共 2423 字,大约阅读时间需要 8 分钟。

是什么?

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

或者
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使的子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。将主要的方法定义为final,防止子类修改算法骨架,将子类必须实现的方法定义为abstract。而普通的方法(无final或abstract修饰)则称之为钩子。

类别

行为型模式

类图

模板方法模式类图

适用场景

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

2、重要的、复杂的方法,可以考虑作为模板方法。
3、一次性实现一个算法的不变的部分,并将可变的为留给子类来实现。
4、实现一个算法时,整体步骤很固定。但是某些部分易变,这部分可以抽象出来,留给子类去实现。

常见案例

1、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

2、Spring IOC容器初始化时

优点

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

2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。

缺点

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

实现步骤

步骤 1

创建一个抽象类,它的模板方法被设置为 final,这样这个方法就不能被重写。这个方法里的执行代码步骤也将固定

demo中创建了一个婚姻模板 第一步 认识 ,第二步 热恋 , 第三步 结婚

但是每个人认识的地方,情节不同。

package com.pattern.template_method;/** * Created by chen on 2018/3/19. * 

* Email 122741482@qq.com *

* Describe: 创建一个抽象类,它的模板方法被设置为 final */public abstract class Marriage {

/** * */ abstract void acquaintance(); abstract void amativeness(); abstract void marry(); //婚姻 模板 模板方法被设置为 final 不被继承 public final void run() { //相识 acquaintance(); //恋爱 amativeness(); //结婚 marry(); }}

步骤2

扩展抽象类,实现了张三 和李四的 婚姻模板

张三

package com.pattern.template_method;/** * * @author chen * @date 2018/3/19 * 

* Email 122741482@qq.com *

* Describe: */public class ZhangSan extends Marriage {

@Override void acquaintance() { System.out.println("在公园认识"); } @Override void amativeness() { System.out.println("在西湖热恋"); } @Override void marry() { System.out.println("在阿尔卑斯山结婚"); }}

李四

package com.pattern.template_method;/** * Created by chen on 2018/3/19. * 

* Email 122741482@qq.com *

* Describe: */public class LiSi extends Marriage {

@Override void acquaintance() { System.out.println("在酒吧认识"); } @Override void amativeness() { System.out.println("在酒店热恋"); } @Override void marry() { System.out.println("在法国结婚"); }}

步骤3

执行模板方法

package com.pattern.template_method;/** * @author chen * @date 2018/3/19 * 

* Email 122741482@qq.com *

* Describe: */public class TemplateMethodDemo {

public static void main(String[] args) { Marriage zs = new ZhangSan(); zs.run(); Marriage ls = new LiSi(); ls.run(); }}

步骤4

查看输出

在公园认识在西湖热恋在阿尔卑斯山结婚在酒吧认识在酒店热恋在法国结婚

博客源码地址

我的官网

我的CSDN地址
我的简书地址
我的github
我的码云地址
阿里云优惠券

1.png

1.jpg

转载地址:http://dqoab.baihongyu.com/

你可能感兴趣的文章
[转]mysql里not in语句怎么写
查看>>
outlook 2010 突破附件大小限制
查看>>
[转][Magick++] How to convert jpg image to raw 32 bit float
查看>>
[转]数据类型 -- uint32_t 类型
查看>>
[转]C语言系统资源控制(getrlimit && setrlimit)
查看>>
[转]linux文件系统基础知识
查看>>
[转]Centos5 下安装/配置lvm使用reiserfs文件系统
查看>>
[转]Use ReiserFS in CentOS 5(lvm)
查看>>
[转]KFS的部署与简单使用
查看>>
[转]KFS官方部署手册
查看>>
[转]Ubuntu 10.04 LTS 安装 sun-java6-jdk
查看>>
[转]mmap详解
查看>>
[转]HDFS和KFS 比较
查看>>
10 个令人惊喜的 jQuery 插件推荐
查看>>
Open Source GIS and Freeware GIS Applications
查看>>
Open Source GIS
查看>>
开源GIS软件SharpMap
查看>>
四个开源商业智能平台比较 (一)
查看>>
WinEdt如何使用中文
查看>>
Programmatic PlyQL via HTTP, ODBC, and JDBC
查看>>