Java学习之抽象模板模式

news2024/9/22 21:25:04

目录

一、基本介绍

二、模板设计模式能解决的问题

三、最佳实践 

一、AA类

二、BB类

三、main方法实现

四、提取相同语句

 五、建立继承关系

父类-Template

子类-AA类

子类-BB类

六、运行中的动态绑定机制


一、基本介绍

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽
象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

二、模板设计模式能解决的问题

1)当功能内部一部分实现是确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

2)编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,就是一种模板模式

三、最佳实践 

一、AA类

package com.hspedu.abstract_;


public class AA{

    //计算任务
    //1+2+...+80000
    public void job(){
        long start = System.currentTimeMillis();
        int num = 0;
        for (int i = 1; i <= 80000; i++) {
            num += i;
        }
        long end = System.currentTimeMillis();
        System.out.println("AA耗时" + (end - start));

    }
   
}

调用System中的currentTimeMillis,返回当前时间(以毫秒为单位)

 

二、BB类

package com.hspedu.abstract_;


public class BB{

   //计算任务
    //1*2+...*1000000
    public void job(){
        long start = System.currentTimeMillis();
        int num = 0;
        for (int i = 1; i <= 1000000; i++) {
            num *= i;
        }
        long end = System.currentTimeMillis();
        System.out.println("BB耗时" + (end - start));

    }
   
}

三、main方法实现

package com.hspedu.abstract_;

public class TestTemplate {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.job();
        BB bb = new BB();
        bb.job();
    }
}

四、提取相同语句

package com.hspedu.abstract_;


public class AA{
    public void calculateTime(){
        long start = System.currentTimeMillis();
        job();
        long end = System.currentTimeMillis();
        System.out.println("AA耗时" + (end - start));
    }
    //计算任务
    //1+2+...+80000
    public void job(){
        int num = 0;
        for (int i = 1; i <= 80000; i++) {
            num += i;
        }

    }
   
}
package com.hspedu.abstract_;


public class BB{
    public void calculateTime(){
        long start = System.currentTimeMillis();
        job();//动态绑定机制
        long end = System.currentTimeMillis();
        System.out.println("BB耗时" + (end - start));
    }
   //计算任务
    //1*2+...*1000000
    public void job(){
      
        int num = 0;
        for (int i = 1; i <= 1000000; i++) {
            num *= i;
        }
       

    }
   
}
package com.hspedu.abstract_;

public class TestTemplate {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.calculateTime();
        BB bb = new BB();
        bb.calculateTime();
    }
}

 五、建立继承关系

父类-Template

package com.hspedu.abstract_;

abstract public class Template {
    public void calculateTime(){
        long start = System.currentTimeMillis();
        job();//动态绑定机制
        long end = System.currentTimeMillis();
        System.out.println("耗时" + (end - start));
    }
    abstract public void job();
}

父类中没有实现job方法的必要,将其设置成abstract方法,在子类中根据子类的需求重写 

子类-AA类

package com.hspedu.abstract_;


public class AA extends Template{

    //计算任务
    //1+2+...+80000

    @Override
    public void job() {
        long num = 0;
        for (long i = 1; i <= 80000; i++) {
            num += i;
        }
    }
}

子类-BB类

package com.hspedu.abstract_;

public class BB extends Template{

    //计算任务
    //1*2+...*1000000

    @Override
    public void job() {
        long num = 0;
        for (long i = 1; i <= 1000000; i++) {
            num *= i;
        }
    }
}
package com.hspedu.abstract_;

public class TestTemplate {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.calculateTime();
        BB bb = new BB();
        bb.calculateTime();
    }
}

六、运行中的动态绑定机制

上述代码中的 aa.calculateTime();根据动态绑定机制,aa的运行类型是AA,所以首先从AA类中调用calculateTime()方法,但是AA类中没有calculateTime()方法,根据继承的查找原则,向上查找其父类-Template类

public void calculateTime(){
    long start = System.currentTimeMillis();
    job();//动态绑定机制
    long end = System.currentTimeMillis();
    System.out.println("耗时" + (end - start));
}
abstract public void job();

按照代码顺序依次运行,运行到job();时,仍然遵循动态绑定机制的规则,根据其运行类型调用job()方法,所以调用AA类中的job()方法

bb.calculateTime()同理

 

 

 

 

 

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

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

相关文章

【Git】概述

目录 1.1 是什么 介绍 历史时间轴 版本控制工具 1.2 能干嘛 作用 Git工作机制 代码托管中心 集中式版本控制系统 分布式版本控制系统 1.3 去哪下 命令行工具&#xff1a;Git for windows 操作系统中可视化工具&#xff1a;TortoiseGit(了解) GitHub网站 1.1 是什…

带你走进Java8新特性Stream流的小世界

目录 一. 什么是流&#xff08;Stream&#xff09; 1.1 流的定义 1.2 流的特点 1.3 操作流 1.4 创建流 二. 流的中间操作 2.1 流的筛选与切片 2.1.1 filter 2.1.2 limit 2.1.3 skip 2.1.4 distinct 2.2 流的映射 2.2.1 map 2.2.2 flatMap 2.3 流的排序 2.3.1 s…

智公网:2023年教师编必背30考点

1、制度化教育阶段开始于&#xff1a;近代。 2、各国的学校教育系统基本形成于&#xff1a;19世纪末。 3、现在世界上大多数国家的义务教育年限在&#xff1a;9年或9年以上。 4、“不愤不启&#xff0c;不悱不发”启发教学法的最早倡导者是&#xff1a;孔子。 5、“建国君民…

【Spring】Spring 6 新特性一一HTTP Interface

简介 Spring 6 的第一个 GA 版本发布了&#xff0c;其中带来了一个新的特性——HTTP Interface。 这个新特性&#xff0c;可以让开发者将 HTTP 服务&#xff0c;定义成一个包含特定注解标记的方法的 Java 接口&#xff0c;然后通过对接口方法的调用&#xff0c;完成 HTTP 请求…

硬盘损坏数据恢复怎么操作?恢复数据的常用方法

硬盘一般固定在电脑里面的存储装置&#xff0c;里面保存着我们大量的数据。随着电脑的使用越加广泛&#xff0c;有时不免出现一些问题&#xff0c;比如硬盘在使用过程中出现数据错误&#xff0c;或者是硬盘的内部零件出现故障。出现这些问题&#xff0c;硬盘损坏数据恢复怎么操…

Redis实现UV统计 | 黑马点评

一、HyperLogLog 1、为什么用HyperLogLog 先介绍两个概念&#xff1a; UV&#xff1a;全称 Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人、1 天内同一个用户多次访问该网站&#xff0c;只记录 1 次。PV&#xff1a;全称 …

车载以太网 - SomeIP测试专栏 - 总纲

关于车载以太网中的SomeIP在网上也逐渐有越来越多的资料,讲的也是非常好;但是个人认为讲的泛,很难让初学者或者初入门者真正了解SomeIP到底是一个什么东西,以及它究竟在车载上有什么作用,本专栏会由浅入深的讲解SomeIP整个协议内容规范,并且对Tc8中SomeIP相关的协议测试用…

实习日记!

目录 http://localhost:5789实习第三天 接下来几天的target 实习第四天 Git的操作 实习第五天 12月5日-Mon 12月6日 12月9日 12月12日 12月15日 useState() hook 12月16日 useEffect() hook async 函数 异步编程 回调函数 12月17日 C#中的&#xff1f;&#x…

postgresql源码学习(54)—— HotStandby从库必须设置大于等于主库的参数

新的一篇本来计划研究lazy_scan_heap函数&#xff0c;但过于复杂还没研究出来… 下午做题遇到一个这样的问题&#xff0c;之前没太关注过&#xff0c;打算学习学习&#xff0c;避免主从配置踩坑。 题干搜一搜&#xff0c;没搜出啥有用的玩意…渣翻成英文搜一搜&#xff0c;搜出…

windows搭建go语言开发环境,IDEA安装go插件并运行Hello world代码

2023年1月27日1.Windows上安装Go语言开发包参考链接&#xff1a;http://c.biancheng.net/view/3992.html1.1.下载Go语言开发包可以在Go语言官网 &#xff08;https://golang.google.cn/dl/&#xff09; 下载Windows 系统下的Go语言开发包&#xff0c;如下图所示。这里我们下载的…

学习Docker就应该掌握的dockerfile语法与指令

在日常的工作中&#xff0c;常常需要制作自己的项目的镜像&#xff0c;一般通过以下两种方式制作镜像&#xff1a;Docker commit、Dockerfile。Docker commitDocker commit一般用做从一个运行状态的容器来创建一个新的镜像。定制镜像应该使用Dockerfile来完成。docker commit 容…

Git场景分析

当前的开发环境如下&#xff0c;我们每个人都对这个项目已经开发一段时间&#xff0c;接下来我们要切换成团队开发模式。 也就是我们由一个团队来完成这个项目实战的内容。团队有组长和若干组员组成(组长就是开发中的项目经理)。 练习场景如下&#xff1a; 1.由组长&#xff0…

LeetCode[1202]交换字符串中的元素

难度&#xff1a;中等题目&#xff1a;给你一个字符串 s&#xff0c;以及该字符串中的一些「索引对」数组 pairs&#xff0c;其中 pairs[i] [a, b]表示字符串中的两个索引&#xff08;编号从 0 开始&#xff09;。你可以 任意多次交换 在 pairs中任意一对索引处的字符。返回在…

java递归问题——汉诺塔

目录 &#x1f332;&#x1f332;什么是汉诺塔&#xff1f; &#x1f430; 当只有1个圆盘的时候&#xff1a; &#x1f430; 当只有2个圆盘的时候&#xff1a; &#x1f430; 当只有3个圆盘的时候&#xff1a; &#x1f332;&#x1f332;汉诺塔代码 &#x1f430;思路 &am…

电脑安全模式怎么进?3种方式教会你!

安全模式经常是电脑死机的时候&#xff0c;我们会选择的一种方式。因为安全模式可以帮助我们修复电脑系统里面的一些错误&#xff0c;电脑安全模式怎么进&#xff1f;其实很简单&#xff0c;主要有以下3种方式&#xff0c;你可以根据你的需要来选择其中一种&#xff01; 操作环…

剑指 Offer 第7天(中午睡起来都十二点了,今天摆了吧)

目录 剑指 Offer 26. 树的子结构 剑指 Offer 27. 二叉树的镜像 剑指 Offer 28. 对称的二叉树 剑指 Offer 26. 树的子结构 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点…

极光厂商通道集成指南

小米集成指南 1、使用JCenter自动化集成步骤 确认AndroidStudio的Project根目录的主gradle中配置了jcenter支持。(新建project默认配置就支持&#xff09; buildscript { repositories { jcenter() } } allprojects {repositories { jcenter() } } 在应用module的gr…

ffmpeg为mkv封装格式的音视频文件添加内挂字幕

现在好莱坞的电影&#xff0c;都是全球看&#xff0c;一个地区的人看电影时&#xff0c;电影屏幕上应该展示对应的本地区语言字幕。故电影画面在不同的地区&#xff0c;需要配置不同的语言字幕。故视频画面里面的字幕应该可以拆出来&#xff0c;不能像老版三国演义&#xff0c;…

数据中心Spine/Leaf+VXLAN的结构

大家过年好&#xff0c;我是技福的小咖老师。今天我们继续聊聊网络架构。 随着业务系统对IT基础设备灵活度要求的不断提升&#xff0c;云计算、大数据以及虚拟化等技术在新型数据中心的建设中发挥着重要作用。如何更好地满足数据中心计算资源灵活调配以及服务扩展&#xff0c;…

C语言块级变量

所谓代码块&#xff0c;就是由{ }包围起来的代码。代码块在C语言中随处可见&#xff0c;例如函数体、选择结构、循环结构等。不包含代码块的C语言程序根本不能运行&#xff0c;即使最简单的C语言程序&#xff08;上节已经进行了展示&#xff09;也要包含代码块。C语言允许在代码…