什么是模板设计模式

对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关键点 <<模板>> <<材料>>

定义:

如同我们在父类中定义处理流程的框架,而在子类中实现具体处理的模板称之为template method 模板设计模式

具体到面向对象

  • <<模板>> 在对象中我们描述为 抽象类: 定义过程pdl
  • <<材料>> 在对象中我们描述为 具体行为的子类:

UML 代码

  • AbstractDisplay: 定义模板框架,以及具体的过程,此处定义为 打印5吃字符
  • CharDisplay: 子类具体的实现 怎么去打印.
  • StringDisplay: 同上

这里要说明一下,子类应该与父类进行协作开发,因为子类具体去做什么不能随意去写,应该根据父类具体的处理流程去定义相应的处理过程,当然可以把文档写清楚,

  • AbstractDisplay
package base.template;

/**
* @program: DesignPatterns
* @description: 只实现display方法抽象类
* @author: Mr.Dai
* @create: 2018-04-28 16:12
**/
public abstract class AbstractDisplay { public abstract void open();
public abstract void print();
public abstract void close(); /**
* 实现打印5次的方法
*/
public void display() {
open();
for (int i = 0; i < 5; i++) {
print();
}
close();
}
}
  • CharDisplay
package base.template;

/**
* @program: DesignPatterns
* @description: 实现单个字符的打印
* @author: Mr.Dai
* @create: 2018-04-28 16:15
**/
public class CharDisplay extends AbstractDisplay { private Character ch; public CharDisplay(char ch) {
this.ch=ch;
} @Override
public void open() {
System.out.print("<<<");
} @Override
public void print() {
System.out.print(ch);
} @Override
public void close() {
System.out.println(">>>");
} @Override
public void display() {
super.display();
}
}
  • StringDisplay
package base.template;

/**
* @program: DesignPatterns
* @description: 实现对个字符串打印
* @author: Mr.Dai
* @create: 2018-04-28 16:18
**/
public class StringDisplay extends AbstractDisplay {
private String string;
private int width; public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
} @Override
public void open() {
printline();
} private void printline() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
@Override
public void print() {
System.out.println("|"+string+"|");
} @Override
public void close() {
printline();
} @Override
public void display() {
super.display();
}
}

转移提高

  • 在java.io.inputstream 使用模板的方法,如下图UML

  • 限于多态的概念,chardisplay stringdisplay 的具体实例都是向上指向的abstractdisplay中的. 无需通过instanceof 制定的具体的子类

  • 由于是通过继承实现 所以遵循的LSP

  • 在子类与父类的协作过程中,必须保证代码量与方法数安排合理, 更多的方法实现放在父类会让子类变得轻松,但是也降低了子类的灵活性.如果父类中实现的方法过少,而且还会导致子类间代码重复出现.

  • 在abstractdisplay 不使用接口而使用抽象类的原因是 需要在定义模板过程的时候 确定相应的算法过程.

相关设计模式

  • Factory Method: 工厂模式 是将template method 模式用于生成实例的一个典型方法
  • Strategy:策略模式 可以使用委托改变的程序的行为,与template method 模式改变部分行为不同的是,他可以作为替换整个算法.

需要掌握的职责

  • 子类角度

    • 在子类中可以使用父类定义的方法
    • 可以在子类增加方法实现新的功能
    • 子类重写父类的方法可以改变父类的行为 一般情况下在定义父类模板的时候 确定是否使用final
  • 父类角度
    • 期待子类实现抽象方法.
    • 要求子类去实现抽象方法.

Template Method 模板设计模式的更多相关文章

  1. Template Method 模板方法

      简介 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的细节 抽象模板AbstractClass的方法分为两类: 基本 ...

  2. Template Method 模板方法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

    今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...

  4. C#设计模式系列:模板方法模式(Template Method)

    你去银行取款的时候,银行会给你一张取款单,这张取款单就是一个模板,它把公共的内容提取到模板中,只留下部分让用户来填写.在软件系统中,将多个类的共有内容提取到一个模板中的思想便是模板方法模式的思想. 模 ...

  5. java设计模式 模板方法模式Template Method

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

  6. 设计模式 : Template method 模板方法模式 -- 行为型

      设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...

  7. 【java设计模式】之 模板方法(Template Method)模式

    1. 模板方法的一个实例 这一节主要来学习一下设计模式中的模板方法模式.我们先来看一个例子:假如现在老板让你做一个汽车的模型,要求只要完成基本功能即可,不考虑扩展性,那你会怎么做呢?我们首先会根据经验 ...

  8. C#设计模式之十四模板方法模式(Template Method)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...

  9. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

随机推荐

  1. Oracle 用户创建及权限设置

    1:创建临时表空间create temporary tablespace user_temp  tempfile 'D:\app\Administrator\oradata\ORACLE\xyrj_t ...

  2. 扫描工具nmap介绍

    NMap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包. 简介 nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推 ...

  3. Django REST framework+Vue 打造生鲜超市(五)

    六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类 ...

  4. Python系列之 - 装饰器

    装饰器主要是用来对函数的操作,我们把定义的函数比作一个蛋糕的话,那么装饰器就是盒子,如果要吃蛋糕就先打开盒子.具体到程序中就是在函数外层又套了一层,套的那一层就是一个装饰器.这么说可能有点抽象,那么我 ...

  5. Png 图像缩放保持 Alpha 通道

    procedure TForm1.Button1Click(Sender: TObject); //uses Winapi.GDIPOBJ, Winapi.GDIPAPI, Winapi.GDIPUT ...

  6. 洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)

    题目描述松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前来 ...

  7. angular的时间指令 以及防止闪烁问题

    1.点击事件 <!doctype html><html lang="en"><head> <meta charset="UTF- ...

  8. 《linux 网络日志分析与流量监控》记录

    mac中有个本机连接vpn的日志,/private/var/log/ppp.log   消除日志(echo "" >/private/var/log/ppp.log ) li ...

  9. PHPCMS v9.6.0 任意文件上传漏洞分析

    引用源:http://paper.seebug.org/273/ 配置了php debug的环境,并且根据这篇文章把流程走了一遍,对phpstorm的debug熟练度+1(跟pycharm一样) 用户 ...

  10. [USACO 13DEC]Vacation Planning(gold)

    Description Air Bovinia operates flights connecting the N farms that the cows live on (1 <= N < ...