Android設計模式之模板方法模式

一、定義:

????????定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

二、結構:

? ? ? ? AbstractClass抽象類:定義算法的骨架,包含模板方法和若干基本方法(抽象方法、具體方法、鉤子方法)。

? ? ? ? ConcreteClass具體子類:實現抽象類中的抽象方法,覆蓋某些具體方法或鉤子方法以定制算法的步驟。

三、代碼示例:

? ? ? ? 1.抽象模板類

public abstract class DataExporter {

? ? // 模板方法(final禁止覆蓋)
? ? public final void exportData(List<String> data, String filename) {
? ? ? ? if (validateData(data)) {
? ? ? ? ? ? String formattedData = formatData(data); // 抽象方法
? ? ? ? ? ? writeToFile(formattedData, filename); ? ? // 抽象方法
? ? ? ? ? ? sendNotification(); ? ? ? ? ? ? ? ? ? ? ?// 鉤子方法
? ? ? ? }
? ? }

? ? // 抽象方法(子類必須實現)
? ? protected abstract String formatData(List<String> data);
? ? protected abstract void writeToFile(String content, String filename);

? ? // 具體方法(默認實現)
? ? protected boolean validateData(List<String> data) {
? ? ? ? return data != null && !data.isEmpty();
? ? }

? ? // 鉤子方法(子類可選覆蓋)
? ? protected void sendNotification() {
? ? ? ? // 默認不發送通知
? ? }
}
? ? ? ? 2.具體子類

// 導出為 CSV 格式
public class CsvExporter extends DataExporter {
? ? @Override
? ? protected String formatData(List<String> data) {
? ? ? ? return String.join(",", data); // 轉換為 CSV
? ? }

? ? @Override
? ? protected void writeToFile(String content, String filename) {
? ? ? ? try (FileWriter writer = new FileWriter(filename)) {
? ? ? ? ? ? writer.write(content);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }

? ? // 覆蓋鉤子方法(導出后發送通知)
? ? @Override
? ? protected void sendNotification() {
? ? ? ? System.out.println("CSV文件導出完成!");
? ? }
}

// 導出為 JSON 格式
public class JsonExporter extends DataExporter {
? ? @Override
? ? protected String formatData(List<String> data) {
? ? ? ? return "{ \"data\": " + data.toString() + " }"; // 簡化的JSON格式
? ? }

? ? @Override
? ? protected void writeToFile(String content, String filename) {
? ? ? ? try (FileWriter writer = new FileWriter(filename)) {
? ? ? ? ? ? writer.write(content);
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
}
? ? ? ? 3.使用模板方法

public class Main {
? ? public static void main(String[] args) {
? ? ? ? List<String> data = Arrays.asList("Apple", "Banana", "Cherry");

? ? ? ? // 導出為 CSV
? ? ? ? DataExporter csvExporter = new CsvExporter();
? ? ? ? csvExporter.exportData(data, "data.csv");

? ? ? ? // 導出為 JSON
? ? ? ? DataExporter jsonExporter = new JsonExporter();
? ? ? ? jsonExporter.exportData(data, "data.json");
? ? }
}
?

四、應用場景:

? ? ? ? 1.多個子類有相同流程但部分步驟不同,如文件導出,網絡請求。

? ? ? ? 2.需要控制子類的擴展點,如鉤子方法。

? ? ? ? 3.框架設計,如Activity的生命周期,AsyncTask。

五、優缺點:

優點:

? ? ? ? 1.代碼復用,避免重復算法流程;

? ? ? ? 2.擴展性強,子類只需關注差異步驟;

? ? ? ? 3.封裝不變部分,提升可維護性。

缺點:

? ? ? ? 1.靈活性受限,算法流程固定;

? ? ? ? 2.繼承強耦合,違法合成復用原則

? ? ? ? 3.父類修改影響子類

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

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

相關文章

Vue3當中el-tree樹形控件使用

tree懸停tooltip效果 文本過長超出展示省略號 如果文本超出懸停顯示tooltip效果 反之不顯示 這里直接控制固定寬度限制 試了監聽寬度沒效果<template><el-treeshow-checkbox:check-strictly"true":data"data"node-key"id":props"…

QScreen 捕獲屏幕(截圖)

一、QScreen核心能力解析 硬件信息獲取 // 獲取主屏幕對象 QScreen* primaryScreen QGuiApplication::primaryScreen();// 輸出屏幕參數 qDebug() << "分辨率:" << primaryScreen->size(); qDebug() << "物理尺寸:" << primar…

PDF處理控件Aspose.PDF教程:通過C#、Java 和 Python刪除 PDF中的水印

Aspose.PDF 是一個功能強大的庫&#xff0c;旨在以編程方式處理 PDF 文檔&#xff0c;提供創建、編輯、轉換和操作的廣泛功能。它支持 C#、Java 和 Python 等多種編程語言&#xff0c;使開發人員能夠精確高效地自動處理 PDF。 對于開發人員來說&#xff0c;由于自動化和定制化…

基于STC89C51的太陽自動跟蹤系統的設計與實現—單片機控制步進電機實現太陽跟蹤控制(仿真+程序+原理圖+PCB+文檔)

摘 要 隨著我國經濟的飛速發展&#xff0c;促使各種能源使用入不敷出&#xff0c;尤其是最主要的能源&#xff0c;煤炭石油資源不斷消耗與短缺&#xff0c;因此人類尋找其他替代能源的腳步正在加快。而太陽能則具有無污染﹑可再生﹑儲量大等優點&#xff0c;且分布范圍廣&…

【硬件測試】基于FPGA的16QAM+幀同步系統開發與硬件片內測試,包含高斯信道,誤碼統計,可設置SNR

目錄 1.算法硬件測試效果 2.算法涉及理論知識概要 2.1 16QAM調制解調原理 2.2 幀同步 3.Verilog核心程序 4.開發板使用說明和如何移植不同的開發板 5.完整算法代碼文件獲得 1.算法硬件測試效果 本文是之前寫的文章: 《基于FPGA的16QAM幀同步系統verilog開發,包含testb…

多路徑 TCP 調度的另一面

參考前面的文章 一個原教旨的多路徑 TCP 和 MP-BBR 公平性推演&#xff0c;一直都破而不立&#xff0c;不能光說怎樣不好&#xff0c;還得說說現狀情況下&#xff0c;該如何是好。 如果 receiver 亂序重排的能力有限(拜 TCP 所賜)&#xff0c;如果非要在多路徑上傳輸 TCP&…

大數據學習(92)-spark詳解

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

RAG - 五大文檔切分策略深度解析

文章目錄 切分策略1. 固定大小分割&#xff08;Fixed-Size Chunking&#xff09;2. 滑動窗口分割&#xff08;Sliding Window Chunking&#xff09;3. 自然語言單元分割&#xff08;Sentence/Paragraph Segmentation&#xff09;4. 語義感知分割&#xff08;Semantic-Aware Seg…

微信小程序引入TDesign組件后報錯一直提示路徑不對(Component is not found in path)的解決方法

最近在做微信小程序的項目&#xff0c;創建好項目后&#xff0c;按官方方式引入TDesign組件&#xff0c;但還是一直提示報錯&#xff08;Component is not found in path "miniprogram_npm/tdesign-miniprogram/button/button" (using by "pages/login/login&qu…

攔截器和過濾器詳解

在 Java Web 開發中&#xff0c;攔截器&#xff08;Interceptor&#xff09;和過濾器&#xff08;Filter&#xff09;是兩種常見的請求處理機制&#xff0c;它們用于對請求和響應進行預處理和后處理 1. 過濾器&#xff08;Filter&#xff09; 1.1 作用 Filter 主要用于對 請求…

【機械視覺】C#+VisionPro聯合編程———【六、visionPro連接工業相機設備】

【機械視覺】C#VisionPro聯合編程———【六、visionPro連接工業相機設備】 目錄 【機械視覺】C#VisionPro聯合編程———【六、visionPro連接工業相機設備】 前言&#xff1a; 連接步驟說明 一. 硬件連接 支持的相機接口類型&#xff1a; 連接步驟 2. 軟件配置 Visio…

筆記:基于環境語義的通感融合技術,將傳統通信由“被動接收”轉為“主動感知”

《基于計算機視覺的感知通信融合理論與關鍵技術研發進展》 介紹了聯合研發的基于環境語義的通感融合技術研發進展。 觀點&#xff1a;利用環境感知信息或環境語義輔助通信的通感融合技術成為6G重要方向之一 產出&#xff1a;基于環境感知的毫米波波束管理方案&#xff0c;并…

Kafka 多線程開發消費者實例

目前&#xff0c;計算機的硬件條件已經大大改善&#xff0c;即使是在普通的筆記本電腦上&#xff0c;多核都已經是標配了&#xff0c;更不用說專業的服務器了。如果跑在強勁服務器機器上的應用程序依然是單線程架構&#xff0c;那實在是有點暴殄天物了。不過&#xff0c;Kafka …

zynq7000 + ucos3 + lwip202_v1_2調試過程

1 現在裸機應用上驗證lwip 跑起來可能會報錯&#xff0c;看下面的鏈接解決 zynq 網卡Phy setup error問題 zynq 網卡Phy setup error問題-CSDN博客 2 ping同以后&#xff0c;在zynq上添加ucos系統 鏈接如下&#xff1a; ZYNQ移植uCOSIII_zynq ucos-CSDN博客 3 移植lwip協議…

Android7 Input(二)Linux 驅動層輸入事件管理

概述 在Linux系統中&#xff0c;將鍵盤&#xff0c;鼠標&#xff0c;觸摸屏等這類交互設備交由Linux Input子系統進行管理&#xff0c;Linux Input驅動子系統由于具有良好的和用戶空間交互的接口。因此Linux Input驅動子系統&#xff0c;不止于只管理輸入類型的設備。也可以將其…

Java內存中的Heap(堆)的作用

Java內存中的Heap&#xff08;堆&#xff09;的作用 在 Java 的內存模型中&#xff0c;Heap&#xff08;堆&#xff09; 是 JVM&#xff08;Java Virtual Machine&#xff09;管理的運行時數據區域之一&#xff0c;主要用于存儲程序運行過程中動態分配的對象和數據。它是 Java…

自行車模型與汽車模型的混合策略在自動駕駛中的多維度協同優化

基于動態架構與智能調度的自動駕駛系統設計 #mermaid-svg-1yvF1EzG07ktndY6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1yvF1EzG07ktndY6 .error-icon{fill:#552222;}#mermaid-svg-1yvF1EzG07ktndY6 .error-tex…

mysql.8.4.4--初始化報錯--libnuma.so.1缺失

錯誤 mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory解決辦法&#xff1a;下載相關依賴 sudo apt update sudo apt install numactl然后重新初始化 mysqld --initialize

【區塊鏈安全 | 第三篇】主流公鏈以太坊運行機制

文章目錄 1. 以太坊賬戶類型2. 以太坊網絡架構2.1 節點類型2.2 交易流程 3. 共識機制4. Gas 機制4.1 Gas 計算方式4.2 以太坊 EIP-1559 交易機制 5. EVM&#xff08;以太坊虛擬機&#xff09;5.1 EVM 結構5.2 EVM 指令5.3 EVM 運行機制 6. 智能合約7. ERC 代幣標準7.1 ERC-207.…

計算機三級信息安全部分英文縮寫

eip&#xff0c;指令寄存器&#xff0c;用于存放指向下一條將執行指令的指針&#xff0c;即返回地址棧頂指針esp基址指針寄存器EBP&#xff0c;基地址數據執行保護DEP(Data Execute Prevention)技術可以設置內存堆棧區的代碼為不可執行狀態&#xff0c;從而防范溢出后代碼的執行…