004-行为型-02-模板方法模式(Template Method)
一、概述
定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
1.1、适用场景
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复
一些方法通用,一些却在每一个子类都重新写了这一方法。
Template Method模式一般应用在具有以下条件的应用中:
1、具有统一的操作步骤或操作过程
2、具有不同的操作细节
3、存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同
1.2、优缺点
优点:
- 提高复用性,提取公共代码,便于维护
- 提高扩展性
- 符合开闭原则
- 行为由父类控制,子类实现
缺点:
- 类数目增加
- 增加了系统实现的复杂度
- 如果父类添加新的抽象方法,所有子类都要改一遍
注意:为防止恶意操作,一般模板方法都加上 final 关键词。
1.3、类图角色及其职责

模板方法模式的角色和职责
1、AbstractClass:抽象类的父类
2、ConcreteClass:具体的实现子类
3、templateMethod():模板方法,具体步骤方法的执行顺序(步骤)
4、method1()与method2():具体步骤方法(细节)
1.4、演进过程
代码来实现一下:我们举个例子,加入我们要组装汽车,步骤是,先组装车头,再组装车身,最后组装车尾,喷漆,是否需要打蜡
这样,我们先建造AbstractClass(其中包含template模板,执行顺序)
// 组装车(AbstractClass)
public abstract class MakeCar {
//定义结构里哪些方法是所有过程都是一样的可复用的,哪些是需要子类进行实现的
//组装车头
public abstract void makeCarHead(); //组装车身
public abstract void makeCarBody(); //组装车尾
public abstract void makeCarTail(); //喷漆 都一样 统一实现
public void makeCarPaint() {
System.out.println("汽车喷漆");
} //打蜡
public abstract void makeCarDaLa(); //声明一个钩子方法 需要打蜡 由用户确认 是否需要
protected boolean needMakeCarDaLa() {
return true;
} //汽车组装流程(template()) 用来控制流程
//申明为final,不希望子类覆盖这个方法,防止更改流程的执行顺序
public final void makeCar() {
this.makeCarHead();
this.makeCarBody();
this.makeCarTail();
this.makeCarPaint();
// 这里是否需要 交由钩子方法来决定
if (needMakeCarDaLa()) {
this.makeCarDaLa();
}
}
}
再新建ConcreteClass(具体的实现细节)
//组装公交车
public class MakeBus extends MakeCar{ @Override
public void makeCarHead() {
System.out.println("组装公交车车头");
} @Override
public void makeCarBody() {
System.out.println("组装公交车车身");
} @Override
public void makeCarTail() {
System.out.println("组装公交车车尾");
} @Override
public void makeCarDaLa() { } @Override
protected boolean needMakeCarDaLa() {
return false;
}
}
// 组装SUV
public class MakeSuv extends MakeCar{ @Override
public void makeCarHead() {
System.out.println("组装SUV车头");
} @Override
public void makeCarBody() {
System.out.println("组装SUV车身");
} @Override
public void makeCarTail() {
System.out.println("组装SUV车尾");
} @Override
public void makeCarDaLa() {
System.out.println("组装SUV-打蜡");
}
}
测试
@Test
public void makeCar() {
MakeCar makeBus = new MakeBus();
makeBus.makeCar(); System.out.println("==========================="); MakeCar makeSuv = new MakeSuv();
makeSuv.makeCar();
}
用户不必关心具体的执行流程(步骤)
输出
组装公交车车头
组装公交车车身
组装公交车车尾
汽车喷漆
===========================
组装SUV车头
组装SUV车身
组装SUV车尾
汽车喷漆
组装SUV-打蜡
二、扩展
spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
jdk:java.util.AbstractList定义一套算法模板,如get(),set()等等,由子类实现。
servlet:javax.servlet.http.HttpServlet定义一套算法模板,如doGet()、doPost()等等,由子类实现。。
mybatis:org.apache.ibatis.executor.BaseExecutor
的
004-行为型-02-模板方法模式(Template Method)的更多相关文章
- 【设计模式】行为型02模板方法模式(Template Method Patten)
五一长假,没有出去,不喜欢嘈杂的人群,玩了会游戏发泄了下憋在心底的戾气,手旁大马克杯里是母亲泡的绿茶.点开自己的播放列表,耳机里传来的是理查德克莱德曼的致爱丽丝.自己是个凡人,卑微渺小的活着.不说废话 ...
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...
- 模板方法模式(Template Method Pattern)——复杂流程步骤的设计
模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...
- 设计模式 - 模板方法模式(template method pattern) JFrame 具体解释
模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(templ ...
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 模板方法模式-Template Method(Java实现)
模板方法模式-Template Method 在模板模式中, 处理的流程被定义在父类中, 而具体的处理则交给了子类. 类关系图很简单: Template接口 这里定义了子类需要实现的方法(before ...
- 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释
模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...
- 设计模式 - 模板方法模式(template method pattern) 具体解释
模板方法模式(template method pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template metho ...
- 二十四种设计模式:模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...
随机推荐
- keras模块学习之泛型模型学习笔记
本笔记由博客园-圆柱模板 博主整理笔记发布,转载需注明,谢谢合作! Keras泛型模型接口是: 用户定义多输出模型.非循环有向模型或具有共享层的模型等复杂模型的途径 适用于实现:全连接网络和多输入 ...
- sql查询排序
ORDER BY _column1, _column2; /* _column1升序,_column2升序 */ ORDER BY _column1, _column2 DESC; /* ...
- IOT设备通讯,MQTT物联网协议,MQTTnet
一.IOT设备的特性 硬件能力差(存储能力基本只有几MB,CPU频率低连使用HTTP请求都很奢侈) 系统千差万别(Brillo,mbedOS,RIOT等) 如使用电池供电,电量消耗敏感 如果是小设备, ...
- LightOJ - 1354 - IP Checking(进制)
链接: https://vjudge.net/problem/LightOJ-1354 题意: An IP address is a 32 bit address formatted in the f ...
- PostgreSQL 11 新特性之覆盖索引(Covering Index)(转载)
通常来说,索引可以用于提高查询的速度.通过索引,可以快速访问表中的指定数据,避免了表上的扫描.有时候,索引不仅仅能够用于定位表中的数据.某些查询可能只需要访问索引的数据,就能够获取所需要的结果,而不需 ...
- H3CNE学习4 命令行简介
一.命令 1.简单命令 2.给路由器接口配置IP地址 3.常用命令 4.删除配置
- python 使用 jt400.jar
jt400helper.py #coding=utf-8 import jpype import os class JT400Helper(object): def __init__(self, se ...
- asp.net大文件分块上传断点续传demo
IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...
- java大文件分块上传断点续传demo
第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName = null; String newpathname = ...
- 溢出的文字隐藏(text-overflow)
<body> <div>一定要首先强制一行内显示,再次和overflow搭配使用,三个步骤缺一不可</div> </body> <style> ...