java设计模式之模板模式

模板模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
比如定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤。

模式中的角色
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

经典代码:
abstract class SortTemplate {public void showSortResult(int[] arr) {sort(arr);for(int x:arr) {System.out.print( x + " / ");}System.out.println();}public abstract void sort(int[] arr);
}class BubbleSort extends SortTemplate {public void sort(int[] arr) {System.out.println("冒泡排序:");for(int i=0;i<arr.length-1;i++){for(int j=0;j<arr.length-1-i;j++){if(arr[j]>arr[j+1]){int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}
}class SelectSort extends SortTemplate{public void sort(int[] arr){System.out.println("选择排序:");for(int i=0;i<arr.length-1;i++){for(int j=i+1;j<arr.length;j++){if(arr[i]>arr[j]){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}}}
}class QuickSort extends SortTemplate{public void sort(int[] arr){System.out.println("快速排序:");quickSort(arr,0,arr.length-1);}public void quickSort(int[] arr,int left,int right){if(left<right){int i=left,j=right,x=arr[left];while(i<j){while(i<j&&arr[j]>=x)j--;if(i<j){arr[i++]=arr[j];}while(i<j&&arr[i]<x)i++;if(i<j){arr[j--]=arr[i];}}arr[i]=x;quickSort(arr,left,i-1);quickSort(arr,i+1,right);}}
}class TemplateDemo{public static void main(String[] args) {int[] arr1 = {44,44,2,32,54,22,88,77,99,11};int[] arr2 = {34,32,6,12,98,34,81,30,1,45};int[] arr3 = {73,5,19,40,99,20,12,48,28,64,308,23};SortTemplate st = new BubbleSort();st.showSortResult(arr1);st = new SelectSort();st.showSortResult(arr2);st = new QuickSort();st.showSortResult(arr3);}
}

运行结果:

冒泡排序:
2 / 11 / 22 / 32 / 44 / 44 / 54 / 77 / 88 / 99 /
选择排序:
1 / 6 / 12 / 30 / 32 / 34 / 34 / 45 / 81 / 98 /
快速排序:
5 / 12 / 19 / 20 / 23 / 28 / 40 / 48 / 64 / 73 / 99 / 308 /

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

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

相关文章

Java 代码性能优化

代码优化&#xff0c;一个很重要的课题。可能有些人觉得没用&#xff0c;一些细小的地方有什么好修改的&#xff0c;改与不改对于代码的运行效率有什么影响呢&#xff1f;这个问题我是这么考虑的&#xff0c;就像大海里面的鲸鱼一样&#xff0c;它吃一条小虾米有用吗&#xff1…

20个常用的正则表达式

正则表达式——古老而又强大的文本处理工具。仅用一段简短的表达式语句&#xff0c;就能快速地实现一个复杂的业务逻辑。掌握正则表达式&#xff0c;让你的开发效率有一个质的飞跃。 正则表达式经常被用于字段或任意字符串的校验&#xff0c;比如下面这段校验基本日期格式的Jav…

Mysql处理海量数据时的一些优化查询速度方法

由于在参与的实际项目中发现当mysql表的数据量达到百万级时&#xff0c;普通SQL查询效率呈直线下降&#xff0c;而且如果where中的查询条件较多时&#xff0c;其查询速度简直无法容忍。曾经测试对一个包含400多万条记录&#xff08;有索引&#xff09;的表执行一条条件查询&…

八大排序算法的Python实现

1、插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中&#xff0c;从而得到一个新的、个数加一的有序数据&#xff0c;算法适用于少量数据的排序&#xff0c;时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分&#xff1a;第…

重定向和请求转发的区别

一次重定向的过程 我的代码里面已经写好了&#xff0c;redirectAndFoward.jsp页面上有一个表单&#xff0c;表单重定向到redirectAndFowardTarget.jsp&#xff0c;那么这一次的重定向过程为&#xff1a; 1、以指定方式&#xff08;表单看method&#xff0c;直接URL发起就是GE…

hibernate映射关系的配置

XML文件个人书写规范 <!-- users属性&#xff0c;本类与User的一对多关系 --> 格式&#xff1a;&#xff1f;属性&#xff0c;本类与&#xff1f;的&#xff1f; ?1 属性名 ?2 关联对类型 ?3 关系配置模板 多对一&#xff1a; <many-to-one name…

公司创始人、董事长、CEO和总裁谁更大,有什么区别?

创始人 英文称Founder&#xff0c;创始人是一个企业&#xff0c;社团&#xff0c;基金、组织&#xff0c;网站等的发起和创立人。任正非是华为的创始人。如果公司一开始就有多个人就叫联合创始人。比如腾讯有马化腾张志东等5位联合创始人&#xff0c;阿里巴巴则有马云、张英等1…

JQuery中的一些重要方法

选择上一级元素 parent(expr) 选择所有上级元素(前辈) parents(expr) 选择下一级元素 children(expr) 选择所有后代元素 find(expr) 选择同级元素(兄弟) siblings(expr) 选择兄元素(前一个) prev( expr ) 选…

各种数据库分页查询sql语句

1.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<endrow) a where a.rc>startrow; 2.DB2数据库分页 Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by 列名) as a) …

Java线程面试题 Top 53

1) 什么是线程&#xff1f; 线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。程序员可以通过它进行多处理器编程&#xff0c;你可以使用多线程对运算密集型任务提速。比如&#xff0c;如果一个线程完成一个任务要…

EL表达式的11个内置对象

EL是JSP内置的表达式语言 JSP2.0开始&#xff0c;不让再使用Java脚本&#xff0c;而是使用EL表达式和动态标签来代替Java脚本 EL替代的是<%... %>&#xff0c;也就是说EL只能做输出 EL可以输出的东西都在11个内置对象中&#xff0c;11个内置对象&#xff0c;其中10个是…

xml的约束

为什么需要约束&#xff1f; 比如现在定义一个person的xml文件&#xff0c;只想要这个文件里面保存人的信息&#xff0c;比如name age等&#xff0c;但是如果在xml文件中写了一个标签<猫>&#xff0c;发现可以正常显示&#xff0c;因为符合语法规范。但是猫肯定不…

会话跟踪技术之Cookie

1 Cookie概述 1.1 什么叫Cookie Cookie翻译成中文是小甜点&#xff0c;小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的&#xff0c;随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来&#xff…

会话跟踪技术之HttpSession

1 HttpSession概述 1.1 什么是HttpSesssion javax.servlet.http.HttpSession接口表示一个会话&#xff0c;我们可以把一个会话内需要共享的数据保存到HttSession对象中&#xff01; 1.2 获取HttpSession对象 HttpSession request.getSesssion()&#xff1a;如果当前会话已…

Spring MVC 中 HandlerInterceptorAdapter的使用

一般情况下&#xff0c;对来自浏览器的请求的拦截&#xff0c;是利用Filter实现的&#xff0c;这种方式可以实现Bean预处理、后处理。 Spring MVC的拦截器不仅可实现Filter的所有功能&#xff0c;还可以更精确的控制拦截精度。 spring为我们提供了org.springframework.web.ser…

Nginx安装教程

1 nginx安装环境 nginx是C语言开发&#xff0c;建议在linux上运行&#xff0c;本教程使用Centos6.5作为安装环境。 --gcc 安装nginx需要先将官网下载的源码进行编译&#xff0c;编译依赖gcc环境&#xff0c;如果没有gcc环境&#xff0c;需要安装gcc&#xff1a;yum install gcc…

Maven Scope取值的含义

maven依赖关系中Scope的作用 Dependency Scope 在POM 4中&#xff0c;<dependency>中还引入了<scope>&#xff0c;它主要管理依赖的部署。目前<scope>可以使用5个值&#xff1a; * compile&#xff0c;缺省值&#xff0c;适用于所有阶段&#xff0c;会…

Solr--企业级搜索应用服务器

1. 概述 1.1.什么是Solr Solr 是Apache下的一个顶级开源项目&#xff0c;采用Java开发&#xff0c;它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言&#xff0c;同时实现了可配置、可扩展&#xff0c;并对索引、搜索性能进行了优化。 Solr可以独立运行&…

HttpClient使用详解

1. 什么是httpclient HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了&#xff0c;越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能&#xff0c;但是对于大部分应用程序来说&#x…

Nginx反向代理及负载均衡

1. nginx反向代理 1.1. 什么是反向代理 通常的代理服务器&#xff0c;只用于代理内部网络对Internet的连接请求&#xff0c;客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服务器发起请求&#xff0c;…