分析模板方法设计模式

首先来看看用来比较int和String分别进行1000次运算求需要的时间进行比较,代码的实现:

package com.test;import java.util.Scanner;
//String的连接1000次
class StringOperate{private String str;public long doWork(){long begin=System.currentTimeMillis();//开始时间setStr(null);for(int i=0;i<10000;i++){setStr(getStr() + i);}long end=System.currentTimeMillis();//结束时间long time=end-begin;//时间差return time;}public String getStr() {return str;}public void setStr(String str) {this.str = str;}
}
class IntOperate{private int num=0;public long doWork(){long begin=System.currentTimeMillis();for (int i = 0; i < 10000; i++) {setNum(getNum() + i);}long end=System.currentTimeMillis();long time=end=begin;return time;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}
}
//模板方法设计模式
class TemplateMethosDemo{}
public class Main{private static Scanner sc;public static void main(String[] args){//统计String连接10000次此时和int相加的时间差StringOperate st=new StringOperate();System.out.println(st.doWork());IntOperate in=new IntOperate();System.out.println(in.doWork());}
}

通过上述代码我们可以看出即使我们实现了上述的功能,但是代码不仅执行的效率低而且代码重复冗余,于是想到利用模板设计方法来实现:

package com.test;import java.util.Scanner;
//模板方法设计模式
abstract class AbstractOperateTimeTemplate{//模板方法:总体算法的骨架,子类不能修改算法的结构因此用finalfinal public long getTotalTime(){long begin=System.currentTimeMillis();//开始时间//具体操作(留给子类去完成),先调用子类中的再调用父类中的方法this.doWork();long end=System.currentTimeMillis();//结束时间long time=end-begin;return time;}//只能之类修改protected abstract void doWork();
}
//String的连接1000次
class StringOperate extends AbstractOperateTimeTemplate{public void doWork(){String str="";for(int i=0;i<10000;i++){str+=i;}}}
class IntOperate extends AbstractOperateTimeTemplate{public void doWork(){int num=0;for(int i=0;i<1000000;i++){num+=i;}}
}public class Main{public static void main(String[] args){//统计String连接10000次此时和int相加的时间差System.out.println(new StringOperate().getTotalTime());System.out.println(new IntOperate().getTotalTime());}
}

上述代码中doWork()也叫钩子函数(回调函数)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JanusGraph(HugeGraph通用): 可视化 GraphEXP 插件安装

JanusGraph&#xff1a; 可视化 Gephi 插件安装可参考&#xff1a;https://datamining.blog.csdn.net/article/details/103894994 下载地址&#xff1a;https://github.com/bricaud/graphexp 安装 解压&#xff0c;在根目录下修改 graphexp.html <div class"nav inp…

java中的接口的定义以及实现关系

一、什么是接口&#xff1f; - 硬件接口&#xff1a;设备之间的连接方式 - 软件接口&#xff1a;程序代码&#xff0c;特殊的类&#xff0c;表示一种规范&#xff0c;是具有N个方法的特征集合。 java中的接口&#xff1a; 专家说的多个抽象类的抽象就是接口。 interface …

迁移 Cloudera Manager 节点 ,迁移Cloudera Scm Server端

目录 1.迁移节点信息&#xff1a;212 -> 44 2.压缩存储目录&#xff0c;备份SCM Server数据 3.在新服务器安装server端 4.修改 cloudera-scm-server 配置文件 5.解压恢复备份数据到新服务器指定配置的目录中 6.修改所有agent节点的配置文件内容 7.迁移ClouderaManage…

CM,CDH 修改迁移元数据库

目录 1.停止所有服务 2.停止Cloudera Management Service服务 3.登录CM所在服务器&#xff0c;停止cloudera-scm-server服务&#xff0c;命令如下&#xff1a; 4.停止CM服务和CDH集群后&#xff0c;对数据库进行迁移 5.登录cloudera-scm-server服务所在服务器&#xff0c;…

面向接口编程思想

package com.test; /*面向接口编程&#xff1a;多态的好处&#xff1a;把实现类对象赋给接口类型变量&#xff0c;屏蔽了不同实现类之间的差异&#xff0c;从而可以做到通用编程 案例&#xff1a;使用USB设备来工作。*/ //指定USB规范 interface IUSB{void swapData(); } class…

Cloudera-Manager-agent 误删恢复

场景&#xff1a; 同事操作失误&#xff0c;将agent节点误删了 解决方法 1.对比正常agent节点与被删除节点安装包差异 yum list installed |grep cloudera 2.通过和正常的服务器对比我们发现&#xff0c;丢失的只有cloudera-manager-agent.x86_64 3.查看yum源中所有clouder…

java中的内部类

内部类&#xff1a;定义在类结构中的另一个类&#xff1a; 类中的定义的成员&#xff1a;字段、方法、内部类 为什么使用内部类&#xff1f; 增强封装&#xff0c;把内部类隐藏在外部类之内&#xff0c;不许其他类访问该类。内部类能提高代码的可读性和可维护性&#xff0c;…

JanusGraph 安装

下载地址&#xff1a;https://github.com/JanusGraph/janusgraph/releases/ 版本&#xff1a;Version 0.3.2 (June 16, 2019) 安装 解压 janusgraph-0.3.2-hadoop2.zip 文件 janusgraph单机版安装 注&#xff1a;本次安装janusgraph基于es和hbse&#xff0c;所以先安装es和…

java中枚举类型详解

枚举类型的引入&#xff1a; 枚举是从java5开始提供的一种新的数据类型&#xff0c;是一个特殊的类&#xff0c;就是固定的多个常量对象的集合。 定义格式&#xff1a; [修饰]enum 枚举类名 { 常量A,常量B,常量C; } 代码&#xff1a; package com.test;enum Weekday {…

Hbase 预写日志WAL处理源码分析之 LogCleaner

目录 Hlog WALs和oldWALs 整体流程 HMaster 初始化 定时执行 LogCleaner 日志清理类 ReplicationLogCleaner 日志清理类 总结 Hlog WALs和oldWALs 这里先介绍一下Hlog失效和Hlog删除的规则 HLog失效&#xff1a;写入数据一旦从MemStore中刷新到磁盘&#xff0c;…

开发者都应该使用的10个C++11特性

摘要 在C11新标准中&#xff0c;语言本身和标准库都增加了很多新内容&#xff0c;本文只涉及了一些皮毛。不过我相信这些新特性当中有一些&#xff0c;应该成为所有C开发者的常规装备。你也许看到过许多类似介绍各种C11特性的文章。下面是我总结的&#xff0c;C开发者都需要学习…

Java8新特性:CompletableFuture 方法介绍

目录 1. runAsync 和 supplyAsync方法 2. whenComplete、whenCompleteAsync、exceptionally 3. thenApply 、 handle thenApply handle 4.thenAccept 、thenRun 方法 消费处理结果 thenAccept thenRun 5. thenCombine 、 thenAcceptBoth thenCombine thenAcceptBot…

Java 8 CompletableFuture 教程

Java 8 有大量的新特性和增强如 Lambda 表达式&#xff0c;Streams&#xff0c;CompletableFuture等。在本篇文章中我将详细解释清楚CompletableFuture以及它所有方法的使用。 什么是CompletableFuture&#xff1f; 在Java中CompletableFuture用于异步编程&#xff0c;异步编…

Dubbo 2.7.x admin 控制台管理提示 : 无元数据信息,请升级至Dubbo2.7及以上版本

版本&#xff1a;2.7.3 安装完Dubbo admin 运行后&#xff0c;查询服务提示 无元数据信息&#xff0c;请升级至Dubbo2.7及以上版本&#xff0c;或者查看application.properties中关于config center的配置&#xff0c;详见 这里 这里描述着处理方法&#xff1a;https://github…

Unity在运行时(代码中)设置材质的渲染模式(RenderingMode)

在Unity中&#xff0c;有些少数情况下我们需要用代码来创建材质。比如说在材质非常多&#xff0c;而仅仅是纹理不一样的时候。 而用代码创建的材质是没有对应的资源文件的&#xff0c;我们也就无法使用Inspector来设置它的Rendering Mode。 关于Rendering Mode&#xff0c;许我…

java中String与new String的区别

String类&#xff1a;表示不可改变的字符串&#xff0c;当前对象创建完毕之后&#xff0c;该对象的内容&#xff08;字符序列&#xff09;是不能改变的&#xff0c;一旦内容改变就是一个新的对象。 String对象的创建&#xff1a; 1&#xff09;&#xff1a;直接赋一个字面量&a…

Yarn 监控 - 监控任务运行状态 (包括Spark,MR 所有在Yarn中运行的任务)

目录 Maven pom引用 配置文件 代码 平时开发中可以在yarn的web页面查看应用程序运行状态&#xff0c;如下图 下面代码实现了&#xff0c;代码监控Yarn运行程序&#xff0c;可以对部分任务进行实时监控 Maven pom引用 这里Demo使用的hadoop版本是 3.0.0 <dependency>…

Behavior Designer

https://my.oschina.net/acitiviti/blog/621627

java中常用的String方法

package com.test;import java.io.Console; import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] agrs){char[] cs new char[]{A, b, c};String str1 new String(cs);System.out.println("-------------变成哈希值…