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使得子类可以不改变一个算法的结构即可重定义该算法 ...
随机推荐
- selenium常用的API(三)获取网页title、html源码
获取网页title 获取页面title的方法可以直接用driver.title获取到,然后可以把获取到的结果用做断言. #encoding=utf-8 from selenium import web ...
- MongoDB与Python的交互
驱动模块 pymongo是python里常用的操作MongoDB的驱动模块 可用pip下载安装 pip install pymongo 创建连接 MongoClient是MongoDB的客户端代理对象 ...
- Union-Find(并查集): Union-Find Application
Union-find 可以应用在很多方面 之前我们看到了union-find在dynamic connectivity上的应用,接下来介绍它在percolation上的应用. union-find在K ...
- 常见的C语言编程规范
头文件: 1.头文件中适合放置接口的声明,不适合放置实现. 2.头文件应向稳定的方向包含,产品依赖于平台,平台依赖于标准库. 3. .c/.h文件禁止包含用不到的头文件. 4.每一个.c文件应有一个同 ...
- python open 函数的一些坑
(1)路径问题 open一个同py文件同一个目录的文件的时候,用以下: txt = open('/filtered_words.txt','rb') words = txt.readline() fi ...
- CentOS 7.5静默安装oracle 11g
1.安装前环境准备 1.1.配置本地yum源 #因公司内网环境,没有互联网,所以需要配置本地yum源,安装所需依赖包等. #挂载ios镜像centos7.5-1804 [root@oracle ~]# ...
- Qt文件读写操作
原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html QFile Class 1.read读文件 加载文件对象 QFile file(&qu ...
- 用provide/inject来实现简单的vuex状态管理功能
在开发的时候,经常会涉及到组件之间的通信.简单的有父子组件的通信,兄弟组件的通信通常可以借助Bus来进行.当然也可以用vuex来进行状态管理,但是,有时候用vuex未免有把简单的问题复杂化. 如果要进 ...
- python写一个随机点名软件
最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...
- vimset
vim ~./vimrc vim /etc/vim/vimrc set nocompatible "去掉有关vi一致性模式,避免以前版本的bug和局限 se ...