模板设计模式

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. C# 获取应用程序内存

    double usedMemory = 0;             Process p = Process.GetProcesses().Where(x => x.ProcessName.Co ...

  2. 【转】shell中的$0 $n $# $* $@ $? $$ 变量 if case for while

    shell中的$0 $n $# $* $@ $? $$  shell 编程 | shift 命令用法笔记 $0当前脚本的文件名 $n传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个 ...

  3. PTA 面向对象程序设计 6-2 逆序字符串

    6-2 逆序字符串 设计一个void类型的函数reverse_string,其功能是将一个给定的字符串逆序.例如,给定字符串为"hello",逆序后为"olleh&quo ...

  4. 免费iApp后台-云接口

    免费稳定,UI易懂简洁,功能强大 应用名称:云接口 应用版本:1.5.9 应用大小:3.55 MB 适用平台:Android(安卓) 应用用处:详情请下载软件 软件安全无毒 更新内容: 1.支付宝当面 ...

  5. PHP的Hash信息摘要扩展框架

    今天我们主要学习的是 PHP 中一些 Hash 散列加密相关的扩展函数的使用,而不是 Hash 算法,这种加密其实也只是一种更复杂一些的密钥算法,与 Hash 算法类似的是,我们输入的一串字符串,就像 ...

  6. TP5更新数据成功,但判断结果不符

    thinkphp的CURD中,使用save方法时会出现一个奇怪的问题,即如果数据没有更新(与原数据相同),返回值判断为false.其实很久之前就发现了这个问题,一度以为是官方代码的问题,但是一直拖延到 ...

  7. Hadoop-3.1.3安装

    0.创建用户并付权限 sudo useradd iwbdsudo passwd iwbd 配置iwbd用户具有root权限 修改/etc/sudoers文件,找到下面一行(91行),在root下面添加 ...

  8. python读取文件编码转换问题

    encode(编码)   decode(解码)   encoding(编码格式) #-*- coding:utf-8 -*- import chardet #用于查看编码 with open(&quo ...

  9. AT4119-[ARC096C]Everything on It【斯特林数,容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4119 题目大意 一个集合\(S=\{k\in[1,n]\cup N\}\),它的所有子集作为元素组成的集合中要 ...

  10. 基于预计算的全局光照(Global Illumination Based On Precomputation)

    目录 基于图像的光照(Image Based Lighting,IBL) The Split Sum Approximation 过滤环境贴图 预计算BRDF积分 预计算辐射度传输(Precomput ...