模板模式,其实是一种思想,在开发中有很多地方用到模板,因为毕竟我们不可能每一个都一出一段!一个模板,填充不同,出来效果也是不一样!

准备画个时序图的,没找到工具,过几天补上!

模板模式在出现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模式的更多相关文章

  1. C#中的TemplateMethod模式

    一个真实的故事 大学的时候就开过一门课程,讲设计模式,可是大学生没什么编程实践经验,在大学里面听设计模式的感觉,就像听天书.听着都有道理,可是完全领会不到其中的奥妙,大抵原因就在于没有走过弯路,没有吃 ...

  2. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  3. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  4. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  5. [Head First设计模式]策略模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  6. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  7. [Head First设计模式]生活中学设计模式——迭代器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  9. [Head First设计模式]生活中学设计模式——外观模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

随机推荐

  1. 机器学习第2课:单变量线性回归(Linear Regression with One Variable)

    2.1  模型表示 之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示: 我们将要用来描述这个回归问题的标记如下: m                代表训练集中实 ...

  2. SparkStreaming数据源Flume实际案例分享

    一.什么是Flume? flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original genera ...

  3. eclipse自动添加作者、日期等注释

    使用eclipse的时候一般会添加自己的注释,标注日期作者等内容,我总结的添加注释的方式有两种:一.在新建class时自动添加注释:二.通过快捷键自动添加注释.下面分别描述一下添加方式. 一.新建cl ...

  4. IntelliJ IDEA 快捷键整理-from imooc

    IntelliJ IDEA 快捷键整理-from imooc 学习了:https://www.imooc.com/learn/9241, main2, 100.for 3, new Date().so ...

  5. Solidworks如何为装配体绘制剖面视图

    1 如图所示的工程图来自装配体   2 点击剖面视图,随后绘制一条线(我从正中劈开),弹出对话框,勾选自动打剖面线,确定   3 剖面视图绘制完毕   三个剖视图如下   关于半剖视图,可以这样做.先 ...

  6. centos内核基本调优

    一.内核(/etc/sysctl.conf) 1.加大端口号范围net.ipv4.ip_local_port_range = 10240 65000 2.tcp/ip重用及超时限制net.ipv4.t ...

  7. Spring IOC源代码具体解释之容器初始化

    Spring IOC源代码具体解释之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比較典型的代码 ClassPathResource res = new C ...

  8. 对于刚開始学习的人Xcode最经常使用的快捷键

    对于刚開始学习的人而言,好多人都是直接使用鼠标进行操作.差点儿非常少使用快捷键,从而再练习编程时比别人慢那么一点,今天就把刚開始学习的人最经常使用的几个快捷键给大家总结下,当然欢迎大家补充. (1)c ...

  9. 【DB2】根据映射表映射出结果

    第一步:创建语法 CREATE TABLE OLIVER_MAP(ID INT,COM_TYPE VARCHAR(100),COM_NAME VARCHAR(100),SR_UP DECIMAL(18 ...

  10. EasyUI 鼠标经过 显示气泡一例

    $(function(){ $('#contacts').tooltip({ position: 'bottom', content: '<c:forEach items="${rec ...