3.设计模式----TemplateMethod模式
模板模式,其实是一种思想,在开发中有很多地方用到模板,因为毕竟我们不可能每一个都一出一段!一个模板,填充不同,出来效果也是不一样!
准备画个时序图的,没找到工具,过几天补上!
模板模式在出现bug时候,也只需要去调整模板就好了,不需要大范围的改动代码!
Demo:
package template.method;
/**
* 模板模式:
* 具体处理方法需要子类自己去实现,流程定义在父类中,调用时候,调用父类中得方法时候
* 出现的结果也会不一样!,这就是模板方法,
* 相当于,一个相同的模板,你填充不同的东西后,出现就是不一样的!
* @author zengrong
*
*/
public abstract class AbstractDisPlay {
/**
* 定义三个抽象方法
*/
public abstract void open();
public abstract void look();
public abstract void close();
/**
* 定义一个模板:
* 这模板调用了三个抽象方法,但是具体干啥,谁都不知道!
*/
public final void show() {
open();
for (int i = 0; i < 5; i++) {
look();
}
close();
} }
package template.method.ch; import template.method.AbstractDisPlay;
/**
* 继承抽象类,第一个小伙伴继承了,
* @author zengrong
*
*/
public class StOne extends AbstractDisPlay { private Integer num; public StOne(Integer num) {
this.num = num;
} @Override
public void open() {
System.out.println("快bo网"); } @Override
public void look() {
System.out.println("苍老师日语教学第"+num+"部");
num++; } @Override
public void close() {
System.out.println("他爸爸回来了,不学了,关闭了!"); } }
package template.method.ch; import template.method.AbstractDisPlay;
/**
* 第二个小伙伴
* @author zengrong
*
*/
public class StTwo extends AbstractDisPlay {
private String str; public StTwo(String str) {
this.str = str;
} @Override
public void open() {
System.out.println("打开了日语网站");
} @Override
public void look() {
System.out.println("网站提供了"+str);
} @Override
public void close() {
System.out.println("看了一会网站被关闭了。。。");
} }
模板模式:
1.抽取了共同的方法在父类直接在抽象类中给出具体实现。而对于有差异性的步骤,则在各自的具体类中给出实现。在父类中定义为抽象方法
2.使用模板类方法去限定制了以后会出现的算法框架

这个就是模板,算法逻辑已经固定了,
1、具体方法(Concrete Method)
2、抽象方法(Abstract Method)
3、钩子方法(Hook Method)
举个例子:
- 泡茶:
烧开水 ==> 冲泡茶叶 ==> 倒入杯中 ==> 添加柠檬
泡咖啡:
烧开水 ==> 冲泡咖啡 ==> 倒入杯中 ==> 添加糖和牛奶
上面这一个流程:
烧开水,倒入杯中 这二个是共同的,可以抽到父类中去,
冲???添加??具体怎么做你也不知道,抽成抽象方法;
那么模板是什么?
customWantsCondiments相当于钩子,true时候,说么是和这个有关系的,
// 模板方法,决定了算法骨架。相当于TemplateMethod()方法
public void prepareBeverage() {
boilWater();
brew();
pourInCup();
if (customWantsCondiments())
{
addCondiments();
}
}
总结:
使用模板方法模式可以将代码的公共行为提取,以达到复用的目的。
而对于特殊化的行为在子类中实现。父类的模板方法可以控制子类中的具体实现。
子类无需了解整体算法框架,只需实现自己的业务逻辑即可。
3.设计模式----TemplateMethod模式的更多相关文章
- C#中的TemplateMethod模式
一个真实的故事 大学的时候就开过一门课程,讲设计模式,可是大学生没什么编程实践经验,在大学里面听设计模式的感觉,就像听天书.听着都有道理,可是完全领会不到其中的奥妙,大抵原因就在于没有走过弯路,没有吃 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]抢票中的设计模式——代理模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]策略模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]生活中学设计模式——迭代器模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]生活中学设计模式——组合模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- [Head First设计模式]生活中学设计模式——外观模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
随机推荐
- 阿里云ECS服务器IIS和WampServer同时运行
网上下载WampServer安装包 安装完成之后默认的端口是80 但是由于此端口被IIS占用了 点击WampServer的图标->Apache->Service->测试80端口 出现 ...
- vscode - 更改emmet生成代码
有时候生成的代码,并不适用自己,所以想想改生成代码: 因为windows查找文件/文件内容非常慢,所以借用了一下Linux的搜索命令,查找了一下 ie=edge ,最后,找到了 expand-ful ...
- Fragment简单用法
一.示意图 二.新建一个左侧碎片布局left_fragment.xml <LinearLayout xmlns:android="http://schemas.android.com/ ...
- Linux组件封装(二)中条件变量Condition的封装
条件变量主要用于实现线程之间的协作关系. pthread_cond_t常用的操作有: int pthread_cond_init(pthread_cond_t *cond, pthread_conda ...
- poj 1719Shooting Contest
//本题大意是对于一个r*c的矩阵,每一列有两个是白色的 //如今选c个位置,要求每一行至少有一个白色的方格被选上 //每一列仅仅能选一个 //用二分匹配求出最大匹配,假设最大匹配等于r,则满足 // ...
- python——Container之字典(dict)详解
字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型.列表是有序的对象结合,字典是无序的对象集合.两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取. ...
- java Map根据value排序
通用方法 public class MapUtil { public static <K, V extends Comparable<? super V>> Map<K, ...
- Rosbridge 的使用
参考文献: http://rosclub.cn/post-569.html ROS与Android的窃窃私语 1.简介 ROSbridge 顾名思义,是一个ROS当中的中间件,ROS 桥,是用 ...
- KingdeeK3-修改单据邮件发送的自定义字段
只需要执行类似下面语句即可: update ICTemplateentry set FVisForBillType = 63,flookupcls=6 where fid ='P01' and fhe ...
- Delphi 与 C/C++ 数据类型对照表(最新的tokyo)
更新,下面这table为最新的tokyo基本数据类型与C++的对照关系: Delphi to C++ types mapping Go Up to Support for Delphi Data ...