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.pswp.cn/news/443345.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443345.shtml
英文地址,請注明出處:http://en.pswp.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;…