Template Method 模板方法 MD
| Markdown版本笔记 | 我的GitHub首页 | 我的博客 | 我的微信 | 我的邮箱 |
|---|---|---|---|---|
| MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
Template Method 模板方法 设计模式
目录
简介
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的细节
抽象模板类的方法分为两类:
- 基本方法(
primitive method):由子类实现的方法,并且在模板方法被调用,客户端不关心这些基本方法,所以可以声明成 protected abstract - 模板方法(
template method):可以有多个, 一般是具体方法,也就是骨架,实现对基本方法的调度,完成固定的逻辑。一般声明为final以防止被覆写
模板方法模式需要开发抽象类和具体子类的程序员之间的协作。一个程序员负责给出一个算法的轮廓和骨架,另一些程序员则负责给出这个算法的各个逻辑步骤。
代表这些具体逻辑步骤的方法称做基本方法,而将这些基本方法汇总起来的方法叫做模板方法,这个设计模式的名字就是从此而来的。
优点
- 模板方法模式通过把
不变的行为搬移到超类,去除了子类中的重复代码。 - 子类实现算法的某些细节,有助于算法的扩展。
- 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开闭原则”。
适用场景:让子类可以重写方法的一部分,而不是整个重写,你可以控制子类需要重写那些操作。
模板方法模式
抽象模板
public abstract class Template {
//【基本方法】:由子类实现,并且在模板方法中被调用的方法;客户端不关心这些基本方法,所以可以声明成 protected abstract
protected abstract void printName();
protected abstract void printAge();
protected void printDate() {
System.out.println(new SimpleDateFormat("yyyy.MM.dd HH-mm-ss").format(new Date()));
}
//【模板方法】:可以有多个, 一般是具体方法,也就是骨架,实现对基本方法的调度,完成固定的逻辑;一般声明为final以防止被覆写
public final void print() {
printName();
printAge();
printDate();
}
}
具体模板
public class TemplateConcrete extends Template {
@Override
protected void printName() {
System.out.println("包青天");
}
@Override
protected void printAge() {
System.out.println(27);
}
}
客户端使用演示
public class Test {
public static void main(String[] args) {
Template temp = new TemplateConcrete();
temp.print();
}
}
public abstract class Template {
//【基本方法】:由子类实现,并且在模板方法中被调用的方法;客户端不关心这些基本方法,所以可以声明成 protected abstract
protected abstract void printName();
protected abstract void printAge();
protected void printDate() {
System.out.println(new SimpleDateFormat("yyyy.MM.dd HH-mm-ss").format(new Date()));
}
//【模板方法】:可以有多个, 一般是具体方法,也就是骨架,实现对基本方法的调度,完成固定的逻辑;一般声明为final以防止被覆写
public final void print() {
printName();
printAge();
printDate();
}
}
public class TemplateConcrete extends Template {
@Override
protected void printName() {
System.out.println("包青天");
}
@Override
protected void printAge() {
System.out.println(27);
}
}
public class Test {
public static void main(String[] args) {
Template temp = new TemplateConcrete();
temp.print();
}
}
2018-2-22
Template Method 模板方法 MD的更多相关文章
- Template Method 模板方法
简介 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的细节 抽象模板AbstractClass的方法分为两类: 基本 ...
- 设计模式13:Template Method 模板方法模式(行为型模式)
Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...
- 设计模式 : Template method 模板方法模式 -- 行为型
设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...
- 设计模式(22)--Template Method(模板方法模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声 ...
- Template Method - 模板方法模式
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...
- 3、Template Method 模板方法 行为型设计模式
1.了解模板方法 1.1 模式定义 定义一个操作算法中的框架,而将这些步骤延迟加载到子类中. 它的本质就是固定算法框架. 1.2 解决何种问题 让父类控制子类方法的调用顺序 模板方法模式使得子类可以不 ...
- 设计模式C++学习笔记之九(Template Method模板方法模式)
模板模式也是相当简单的一种模式,而且是比较常用的.模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些 ...
- 设计模式学习笔记——Template Method模板方法模式
可能是最简单的设计模式. 而且你我都用过而不自知. 因为,模板方法模式也者,就是面向对象中的继承.公用部分放在父类,子类继承父类,然后扩展.呵呵.
- 封装算法: 模板方法(Template Method)模式
template method(模板方法)模式是一种行为型设计模式.它在一个方法中定义了算法的骨架(这种方法被称为template method.模板方法),并将算法的详细步骤放到子类中去实现.tem ...
随机推荐
- C++运算符重载 模板友元 new delete ++ = +=
今天的重载是基于C++ 类模板的,如果需要非类模板的重载的朋友可以把类模板拿掉,同样可以参考,谢谢. 一.类模板中的友元重载 本人喜好类声明与类成员实现分开写的代码风格,如若您喜欢将类成员函数的实现写 ...
- 1036 Boys vs Girls (25)(25 point(s))
problem This time you are asked to tell the difference between the lowest grade of all the male stud ...
- LINUX按键驱动程序
<<混杂设备驱动模型>> <混杂设设备的描述> <混在设备的概念> 在linux系统中,存在一类字符设备,他们拥有相同的主设备号(10),但是次设备号不 ...
- Django Q对象
使用Q 对象进行复杂的查询¶ filter() 等方法中的关键字参数查询都是一起进行“AND” 的. 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q 对象. Q 对象 (django.db ...
- Mistakes(Updating)
1.当调试时发现无法正常调用函数时,检查是否发生爆栈 对于每个栈仅有4MB的空间,开int只能开大约5*10^5. 大数组一定要开全局变量 2.当long long=int*int时会爆int,一定要 ...
- BZOJ 3238 [Ahoi2013]差异(后缀自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题目大意] 给出一个串,设T[i]表示从第i位开始的后缀, 求sum(len( ...
- 【Python3】【贪心】hdu4296 Buildings
题意: n个板,每个板有重量和强度w和s,还有PDV值(上面的总重量-该板的强度) 对于某种叠放方式,PDV的最大值为其代表值 求该值的最小值 考虑只有两个板的情况:a和b,很显然下面的比上面的容 ...
- Curl 及 Curl的使用介绍
Curl 简介 Curl是Linux下一个很强大的http命令行工具,其功能十分强大. 1) 二话不说,先从这里开始吧! $ curl http://www.linuxidc.com 回车之后,www ...
- android显示TextView文字的倒影效果
今天记录一下TextView的倒影效果,显示一串文字,然后在文字的下方显示出它的倒影,先上效果图: 最重要的就是View中getDrawingCache()方法,该方法可以获取cache中的图像,然后 ...
- Codeforces Round #222 (Div. 1) D. Developing Game 扫描线
D. Developing Game 题目连接: http://www.codeforces.com/contest/377/problem/D Description Pavel is going ...