Java設計模式 (一) 模板方法設計模式

什么是模板方法設計模式?

模板方法設計模式是一種行為型設計模式,它定義了一個算法的骨架,并將一些步驟的具體實現延遲到子類中。模板方法模式可以幫助確保在算法的不同部分中保持一致性,同時也允許子類根據需要進行具體實現。

模板方法模式的關鍵特點包括:

  • 抽象類: 定義一個抽象類,其中包含一個模板方法,該方法定義了算法的骨架。這個抽象類可以包含一些通用的實現或共享的代碼。
  • 具體步驟: 在抽象類中,將算法的不同步驟定義為抽象方法。這些步驟需要由具體的子類來實現。
  • 模板方法: 這是算法的核心方法,它包含了算法的基本步驟,可能包括調用不同的具體步驟方法。這個方法通常是 final,以防止子類修改整體算法結構。
  • 鉤子方法:鉤子方法是一種在抽象類中定義的方法,子類可以選擇是否覆蓋它。這些方法通常是空方法,可以在模板方法的執行過程中被調用,以便影響算法的某些特定步驟。

模板方法設計模式的優點包括:

  • 提供了一種統一的算法結構,使得算法在不同的子類中保持一致。
  • 提供了代碼復用和共享的機制,避免了重復的代碼。
  • 允許子類根據需要覆蓋特定步驟的實現,實現了開閉原則。

一個典型的模板方法設計模式的例子是 Java 中的 AbstractList 類,它定義了訪問和修改列表的算法框架,然后由具體的子類(如 ArrayList、LinkedList 等)實現不同的細節。

總之,模板方法設計模式允許您定義一個算法的骨架,然后將一些具體的步驟延遲到子類中實現。這種方式提高了代碼的復用性和可維護性,同時也確保了算法的一致性。

模板抽象類


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** @author Wang*/
@Slf4j
public abstract class AbstractSynFileHandler<T> implements InitializingBean {/*** parseFile* @param inputStream   inputStream* @return  <T> List<T>* @throws IOException  IOException*/public abstract List<T> parseFile(InputStream inputStream) throws IOException;/*** getHandlerName* @return  String*/public abstract String getFileName();@Overridepublic void afterPropertiesSet(){SynFileFactory.registerHandler(getFileName(), this);}}

在這個代碼片段中,AbstractSynFileHandler 是一個抽象類,定義了一個模板方法模式的結構。模板方法模式的關鍵是抽象類中的模板方法,該方法定義了一個算法的基本步驟,但是某些步驟的具體實現留給了子類來完成。

在這個代碼中,parseFilegetFileName方法是需要子類實現的具體步驟。這些步驟的具體實現因應用而異,所以它們被定義為抽象方法。然后,在 afterPropertiesSet方法中,SynFileFactory.registerHandler 方法被調用,該方法將當前實例注冊到 SynFileFactory中,實現了模板方法模式中的模板方法調用和延遲到子類的具體實現。

子類實現


import cn.hutool.core.text.CharSequenceUtil;
import com.woodare.cdw.core.Cons;
import com.woodare.cdw.core.SiebelCons;
import com.woodare.cdw.jpa.entity.AccountEntity;
import com.woodare.cdw.siebel.AbstractSynFileHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;/*** @author Wang*/
@RequiredArgsConstructor
@Slf4j
@Component
public class AccountHandler extends AbstractSynFileHandler<AccountEntity> {@Overridepublic List<AccountEntity> parseFile(InputStream inputStream) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));List<AccountEntity> list = new ArrayList<>();String line;int lineNum = 0;while ((line = reader.readLine()) != null) {if (lineNum == 0) {lineNum++;continue;}String[] values = line.split(Cons.Delimiter.WAVY);AccountEntity accountEntity = new AccountEntity();this.buildEntity(values, accountEntity);list.add(accountEntity);lineNum++;}return list;}private void buildEntity(String[] values, AccountEntity accountEntity) {if(CharSequenceUtil.isNotBlank(values[0])){accountEntity.setSiebelId(values[0]);}if(CharSequenceUtil.isNotBlank(values[1])){accountEntity.setFirstName(values[1]);}if(CharSequenceUtil.isNotBlank(values[2])){accountEntity.setLastName(values[2]);}if(CharSequenceUtil.isNotBlank(values[3])){accountEntity.setMiddleInitial(values[3]);}if(CharSequenceUtil.isNotBlank(values[4])){accountEntity.setEmail(values[4]);}if(CharSequenceUtil.isNotBlank(values[5])){accountEntity.setCellPhone(values[5]);}if(CharSequenceUtil.isNotBlank(values[6])){accountEntity.setAddress1(values[6]);}if(CharSequenceUtil.isNotBlank(values[7])){accountEntity.setAddress2(values[7]);}if(CharSequenceUtil.isNotBlank(values[8])){accountEntity.setCity(values[8]);}if(CharSequenceUtil.isNotBlank(values[9])){accountEntity.setState(values[9]);}if(CharSequenceUtil.isNotBlank(values[10])){accountEntity.setZip(values[10]);}}@Overridepublic String getFileName() {return SiebelCons.ACCOUNT;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41256.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41256.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41256.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式光伏運維平臺在公益場館屋頂光伏發電系統的應用分析

摘要&#xff1a;2021年9月&#xff0c;國家發改委印發烷善能源消費強度和總量雙控制度方案》&#xff0c;提出鼓勵可再生能源的使用&#xff0c;支持可再生能源發展。在這樣的政策推動下&#xff0c;光伏發電市場無疑將迎來高質量發展的新機遇。現結合山東博物館光伏電站日常管…

系統架構設計師---計算機基礎知識之數據庫系統結構與規范化

目錄 一、基本概念 二、 數據庫的結構 三、常用的數據模型 概念數據模型

git add 用法

git add 是 Git 的一個命令&#xff0c;用于將更改的文件加入到暫存區&#xff08;staging area&#xff09;&#xff0c;準備提交這些更改。以下是該命令的常見用法&#xff1a; 添加單個文件 git add 文件名添加多個文件 git add 文件名1 文件名2 ...添加所有當前目錄下的更改…

面試攻略,Java 基礎面試 100 問(十八)

JAVA IO 包 JAVA NIO NIO 主要有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buffer(緩沖區), Selector。 傳統 IO 基于字節流和字 符流進行操作&#xff0c;而 NIO 基于 Channel 和 Buffer(緩沖區)進行操作&#xff0c;數據總是從通道讀取到緩沖區 中&#xff0c;或者…

Linux命令(70)之bzip2

linux命令之bzip2 1.bzip2介紹 linux命令bzip2是用來壓縮或解壓縮文件名后綴為".bz2"的文件 2.bzip2用法 bzip2 [參數] filename bzip2常用參數 參數說明-d解壓縮文件-t測試壓縮文件是否正確-k壓縮后&#xff0c;保留源文件-z強制壓縮-f強制覆蓋已存在的文件-v顯…

TRT8系列—— 版本差異注意事項

TRT8 一個大版本&#xff0c;8.4-、 8.5、 8.6&#xff08;包含預覽功能&#xff09;卻有很多變動&#xff0c;一不注意就發現很混亂&#xff0c;特備注此貼。建議具體case可以參考這個合集&#xff0c;真心安利&#xff1a;https://github.com/NVIDIA/trt-samples-for-hackath…

Go語言GIN框架安裝與入門

Go語言GIN框架安裝與入門 文章目錄 Go語言GIN框架安裝與入門1. 創建配置環境2. 配置環境3. 下載最新版本Gin4. 編寫第一個接口5. 靜態頁面和資源文件加載6. 各種傳參方式6.1 URL傳參6.2 路由形式傳參6.3 前端給后端傳遞JSON格式6.4 表單形式傳參 7. 路由和路由組8. 項目代碼mai…

GaussDB 實驗篇+openGauss的4種1級分區案例

? 范圍分區/range分區 -- 創建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…

除自身以外數組的乘積(c語言詳解)

題目&#xff1a;除自身外數組的乘積 給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據保證數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請不要使用除…

Android Studio實現解析HTML獲取圖片URL,將URL存到list,進行瀑布流展示

目錄 效果展示build.gradle(app)添加的依賴(用不上的可以不加)AndroidManifest.xml錯誤代碼activity_main.xmlitem_image.xmlMainActivityImage適配器ImageModel 接收圖片URL效果展示 build.gradle(app)添加的依賴(用不上的可以不加) dependencies {implementation co…

Android 13 像Settings一樣開啟關閉深色模式

一.背景 由于客戶定制的Settings需要開啟關閉深色模式,所以需要自己調用開啟關閉深色模式 二.前提條件 首先應用肯定要是系統應用,并且導入framework.jar包,具體可以參考: Android 應用自動開啟輔助(無障礙)功能并使用輔助(無障礙)功能_android 自動開啟無障礙服務_龔禮鵬…

Java版電子招投標管理系統源碼-電子招投標認證服務平臺-權威認證 tbms

? 功能描述 1、門戶管理&#xff1a;所有用戶可在門戶頁面查看所有的公告信息及相關的通知信息。主要板塊包含&#xff1a;招標公告、非招標公告、系統通知、政策法規。 2、立項管理&#xff1a;企業用戶可對需要采購的項目進行立項申請&#xff0c;并提交審批&#xff0c;…

Neo4j之CREATE基礎

在 Neo4j 中&#xff0c;CREATE 語句用于創建節點、關系以及節點屬性。 創建節點&#xff1a; CREATE (p:Person {name: John, age: 30});這個查詢會創建一個具有 "Person" 標簽的節點&#xff0c;節點屬性包括 "name" 和 "age"。 創建帶有關…

【java畢業設計】基于Spring Boot+Vue+mysql的論壇管理系統設計與實現(程序源碼)-論壇管理系統

基于Spring BootVuemysql的論壇管理系統設計與實現&#xff08;程序源碼畢業論文&#xff09; 大家好&#xff0c;今天給大家介紹基于Spring BootVuemysql的論壇管理系統設計與實現&#xff0c;本論文只截取部分文章重點&#xff0c;文章末尾附有本畢業設計完整源碼及論文的獲取…

創建遠程倉庫以及分支

1、 創建遠程倉庫 這里有兩種方式 1.1 利用git的插件有Gitee、GitHub。 來到 GitHub 中發現已經幫我們創建好了 gitTest 的遠程倉庫。 1.2 通過Push的方式推送本地庫到遠程庫 這種方式需要提前創建好倉庫。 右鍵點擊項目&#xff0c;可以將當前分支的內容 push 到 GitHub 的遠…

Python爬蟲——scrapy_工作原理

引擎向spiders要url引擎把將要爬取的url給調度器調度器會將url生成的請求對象放入到指定的隊列中從隊列中出隊一個請求引擎將請求交給下載器進行處理下載器發送請求獲取互聯網數據下載器將數據返回給引擎引擎將數據再次給到spidersspiders通過xpath解析該數據&#xff0c;得到數…

vue3+ts+tsx的使用與好處(語法方面:tsx==jsx)

前言&#xff1a; 整理分享下vue3tstsx相關的資料&#xff0c;有react使用經驗的小伙伴應該更能理解這個的好處&#xff0c;終于在vue3中也支持了&#xff0c;相當于函數的方法來操作界面。 1、vue3項目中為什么要用tsx&#xff08;等同于我們react的jsx&#xff09; 類型安全…

【STM32】 工程

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介紹&#xff1a;"謓澤"正在路上朝著"攻城獅"方向"前進四" &#x1f50e;&#x1f3c5; 榮譽&#xff1a;2021|2022年度博客之星物聯網與嵌入式開發TOP5|TOP4、2021|2022博客之星TO…

oracle 更新語句條件匹配不生效

最近在工作中寫了一個供別人調用的Oracle的存儲過程接口&#xff0c;功能很簡單&#xff0c;就是根據傳入的幾個參數來更新表中的某些數據&#xff0c;但是在聯調過程中傳入的更新匹配條件和被更新的數據一致對不上&#xff0c;更新的數據會比匹配的三個條件的數據多&#xff0…

注解 @Slf4j

注解 Slf4j 1. 注解由來&#xff1a; Slf4j 是 Lombok 提供的一種注解&#xff0c;用于在類中自動生成一個名為 log 的日志對象。通過使用 Slf4j 注解&#xff0c;可以方便地在代碼中使用日志功能&#xff0c;而無需手動創建和初始化日志對象。 2. 注解示例&#xff1a; Slf…