模板设计模式

1.模板模式简介

模板模式(Template ):模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

2.模板模式的结构

模式中的角色:

抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。

具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

3.通用代码如下

抽象模板类:

public abstract class AbstractClass {
//基本方法
protected abstract void doSomething();
//基本方法
protected abstract void doAnything();
//模板方法
public void templateMethod(){
/* 调用基本方法,完成相关的逻辑 this.doAnything();
this.doSomething();
}
}

具体模板类:

public class ConcreteClass1 extends AbstractClass {
//实现基本方法
protected void doAnything() {
//业务逻辑处理
}
protected void doSomething() {
//业务逻辑处理
}
}
public class ConcreteClass2 extends AbstractClass { //实现基本方法
protected void doAnything() {
//业务逻辑处理
}
protected void doSomething() {
//业务逻辑处理
}
}

场景类:

public class Client {
public static void main(String[] args) {
AbstractClass class1 = new ConcreteClass1();
AbstractClass class2 = new ConcreteClass2();
//调用模板方法
class1.templateMethod();
class2.templateMethod();
}

4.案例讲解

需求

  • 有多个类,完成不同的job

  • 要求能够得到各自的完成时间

1.)传统方式实现

代码

package Abstract;

public class AbstractExercise {
public static void main(String[] args) {
AA aa = new AA();
aa.calcTime(); BB bb = new BB();
bb.calcTime();
}
}
class AA {
// 计算任务1
// 1 + 2 + ...+ 100000
public void calcTime() {
//得到开始时间
long start = System.currentTimeMillis();
job(); // 计算执行任务的时间
// 得到结束时间
long end = System.currentTimeMillis();
System.out.println("AA 执行的时间 " + (end - start) + "毫秒");
} long sum = 0;
public void job(){
for (int i = 1; i <= 100000; i++) {
sum += i;
}
}
} class BB {
// 计算任务2
// 1*1 + 2*2 +... 10000*10000
public void calcTime() {
//得到开始时间
long start = System.currentTimeMillis();
job(); // 计算执行任务的时间
// 得到结束时间
long end = System.currentTimeMillis();
System.out.println("BB 执行的时间 " + (end - start) + "毫秒");
}
long sum = 0;
public void job(){
for (int i = 1; i <= 10000; i++) {
sum += i * i;
}
}
}
// CC类 DD类.......

对于不同的任务它们有自己各自的执行方式,我们需要做的是统计它们各自执行完任务所花费的时间。我们通过观察发现计算时间的方法被重复的使用,方法是一样的方法只是各个任务执行的细节不同罢了,如果有CC类 、DD类.......的不同任务job()——因此我们可以将其设置为抽象方法!,那么计算时间的方法calcTime()要在每一个类中使用!这样代码就大量的重复了,不利于修改与维护!——因此我们可以将其设置为模板方法!

2.)模板设计模式实现

抽象模板类(AbstractClass)

package Abstract;

public abstract class Tempalte { //父类——模板类
public abstract void job();// 抽象方法 // 模板方法
public void calcTime() { // 实现方法,调用job()方法
//得到开始时间
long start = System.currentTimeMillis();
job(); // 计算执行任务的时间————动态绑定机制
// 得到结束时间
long end = System.currentTimeMillis();
System.out.println("任务执行的时间 " + (end - start) + "毫秒");
}
}

具体模板类(ConcreteClass)

package Abstract;

public class AA extends Tempalte{
// 计算任务1
// 1 + 2 + ...+ 100000
long sum = 0;
@Override
public void job(){
for (int i = 1; i <= 100000; i++) {
sum += i;
}
}
}
package Abstract;

public class BB extends Tempalte{
// 计算任务2
// 1*1 + 2*2 +... 10000*10000
long sum = 0;
@Override
public void job(){
for (int i = 1; i <= 10000; i++) {
sum += i * i;
}
}
}

 测试类(ConcreteClass)

package Abstract;

public class Application {
public static void main(String[] args) {
Tempalte aa = new AA();
aa.calcTime(); // 动态绑定机制,对多态的理解
Tempalte bb = new BB();
bb.calcTime();
}
}

5.模式模式优缺点:

1.)优点

模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。子类实现算法的某些细节,有助于算法的扩展。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

2.)缺点

每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

3.)适用场景

在某些类的算法中,用了相同的方法,造成代码的重复。控制子类扩展,子类必须遵守算法规则。

注:如果文章有任何错误或不足,请各位大佬尽情指出,评论留言留下您宝贵的建议!如果这篇文章对你有些许帮助,希望可爱亲切的您点个赞推荐一手,非常感谢啦

Java设计模式——模板设计模式的更多相关文章

  1. Java 设计模式 ------ 模板设计模式

    模板设计模式主要来源于生活中有一些事情是有模板可以遵循的.举两个生活中的例子,如泡茶和泡咖啡,看一看. 泡茶有以下四个步骤:  1, 烧开水;  2 把茶放到水杯中; 3,倒入开水; 4, 加糖. 泡 ...

  2. Java中的模板设计模式,太实用了!

    顾名思义,模板设计模式就是将许多公用的常用的代码封装成一个模板,我们只需要实现不同的业务需求的代码,然后和模板组合在一起,那么就得到完整的逻辑. 在我们的日常开发中,常用的模板模式有两种实现方式:继承 ...

  3. 【设计模式】Java设计模式 - 模板模式

    Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  4. JAVA设计模式:模板设计模式

    1.模板设计模式,是为了体现继承的作用.它主要的作用就是在类中定义一些公共的方法和标准,而其具体的实现则叫给其子类来根据子类具体的行为来实现:因为模板设计模式中必经还有一些自己的方法不是抽象的方法,只 ...

  5. java模板设计模式

    1.概述 模板设计模式定义:定义一个操作中的算法骨架,将步骤延迟到子类中. 模板设计模式是一种行为设计模式,一般是准备一个抽象类,将部分逻辑以具体方法或者具体的构造函数实现,然后声明一些抽象方法,这样 ...

  6. Template Method 模板设计模式

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

  7. Java进阶篇 设计模式之十四 ----- 总结篇

    前言 本篇是讲述之前学习设计模式的一个总结篇,其目的是为了对这些设计模式的进行一个提炼总结,能够通过查看看此篇就可以理解一些设计模式的核心思想. 设计模式简介 什么是设计模式 设计模式是一套被反复使用 ...

  8. Java进阶篇设计模式之一 ----- 单例模式

    前言 在刚学编程没多久就听说过设计模式的大名,不过由于当时还是个彻彻底底的菜鸟,并没有去触碰.直到在开始工作中对简单的业务代码较为熟悉之后,才正式的接触设计模式.当时最早接触的设计模式是工厂模式,不过 ...

  9. java之模板方法设计模式

    抽象类体现的就是一种模板模式的设计.抽象类作为多个子类的通用模板.子类在抽象类的基础上进行扩张和改造,但子类总体上会保留抽象类的行为方式. 解决的问题: 当功能内部一部分实现是确定的,一部分实现是不确 ...

随机推荐

  1. 【第一篇】- Git 教程之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git 教程 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制 ...

  2. Linux 文本相关命令(1)

    Linux 文本相关命令(1) 前言 最近线上环境(Windows Server)出现了一些问题,需要分析一下日志.感觉 Windows 下缺少了一些 Linux 系统中的小工具,像在这波操作中用到的 ...

  3. docker run配置参数

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...

  4. Vmware 15 安装 win7 虚拟机 (初学者操作与详解教程)

    @ 目录 一.镜像下载 1.什么是镜像 2.常见的系统镜像文件格式 3.下载win7旗舰版镜像 二.VMware Workstation 下载 1.什么是虚拟机 2.VMware 主要功能 3.VMw ...

  5. Git报错-refusing to merge unrelated histories

    执行git pull 时报错: 出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库.假如我之前是直接clone的方式在本地建立起远程github仓库的克隆本地仓库就不会有这问题了 ...

  6. mysql 基础配置经验

    创建库: 排序:utf8_unicode_ci和utf8_general_ci对中.英文来说没有实质的差别.utf8_general_ci校对速度快,但准确度稍差. 普遍的意思utf8_unicode ...

  7. Groovy系列(2)- Groovy与Java的不同之处

    Groovy与Java的不同之处 默认 imports 所有这些包和类都是默认导入的,不必使用显式import语句来使用它们 java.io.* java.lang.* java.math.BigDe ...

  8. P6091-[模板]原根

    正题 题目链接:https://www.luogu.com.cn/problem/P6091 题目大意 给出一个数\(p\),求出它的所有在\([0,p]\)的原根. 解题思路 原根的定义,\(\de ...

  9. P3293-[SCOI2016]美味【主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3293 题目大意 给出一个长度为\(n\)的序列,\(m\)次询问给出\(b,x,l,r\)表示询问在\([l,r ...

  10. a标签的href属性拼接问题

    <a id="nickName" href="/community/user/userinfo?nickName="></a> 如上所示 ...