【Mytais系列】Myatis的設計模式

目錄

設計模式

1. 工廠模式(Factory Pattern)

2. 建造者模式(Builder Pattern)

3. 動態代理模式(Dynamic Proxy Pattern)

4. 模板方法模式(Template Method Pattern)

5. 策略模式(Strategy Pattern)

6. 裝飾器模式(Decorator Pattern)

7. 責任鏈模式(Chain of Responsibility Pattern)

8. 單例模式(Singleton Pattern)

總結


設計模式


1. 工廠模式(Factory Pattern)

MyBatis 中的應用

  • SqlSessionFactory:通過工廠創建 SqlSession 對象,屏蔽了底層連接池、事務等細節。
  • ObjectFactory:負責創建結果集映射的 Java 對象(如 POJO),支持自定義擴展。

日常開發借鑒

  • 場景:需要解耦對象的創建與使用時。
  • 示例:數據庫連接池、日志工廠、配置解析器等。
// 簡單工廠示例
public class ConnectionFactory {public static Connection getConnection(String dbType) {if ("mysql".equals(dbType)) {return new MySqlConnection();} else if ("oracle".equals(dbType)) {return new OracleConnection();}throw new IllegalArgumentException("Unsupported DB type");}
}

2. 建造者模式(Builder Pattern)

MyBatis 中的應用

  • XMLConfigBuilder:解析 mybatis-config.xml,逐步構建 Configuration 對象。
  • SqlSessionFactoryBuilder:通過鏈式調用構建 SqlSessionFactory

日常開發借鑒

  • 場景:需要分步構造復雜對象,尤其是參數多且可選時。
  • 示例:構建 HTTP 請求參數、配置復雜 DTO 對象。
// 建造者示例:構建用戶對象
public class User {private String name;private int age;// 私有構造,強制使用 Builderprivate User(Builder builder) { ... }public static class Builder {private String name;private int age;public Builder name(String name) { this.name = name; return this; }public Builder age(int age) { this.age = age; return this; }public User build() { return new User(this); }}
}// 使用
User user = new User.Builder().name("Alice").age(30).build();

3. 動態代理模式(Dynamic Proxy Pattern)

MyBatis 中的應用

  • Mapper 接口代理:通過 MapperProxy 動態生成 Mapper 接口的實現類,將方法調用轉發到 SQL 執行邏輯。

日常開發借鑒

  • 場景:需為接口動態生成實現,或在方法調用前后添加統一邏輯(如日志、事務)。
  • 示例:RPC 客戶端、AOP 切面編程、權限校驗攔截器。
// JDK 動態代理示例
public class LogProxy implements InvocationHandler {private Object target;public LogProxy(Object target) { this.target = target; }@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Method " + method.getName() + " called");return method.invoke(target, args);}
}// 使用
UserService userService = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),new Class[]{UserService.class},new LogProxy(new UserServiceImpl())
);

4. 模板方法模式(Template Method Pattern)

MyBatis 中的應用

  • Executor 接口:定義了 update, query 等方法的執行流程,具體實現由子類(如 SimpleExecutor, BatchExecutor)完成。
  • BaseExecutor:抽象類封裝了緩存管理、事務提交等通用邏輯,子類僅需實現 doUpdate, doQuery 等具體步驟。

日常開發借鑒

  • 場景:多個類有相同流程,但某些步驟需差異化實現。
  • 示例:支付流程(統一下單、驗簽,支付方式不同)、數據導出模板。
// 模板方法示例:數據導出
public abstract class DataExporter {// 模板方法:定義流程public final void export() {prepareData();formatData();saveToFile();}protected abstract void prepareData();protected abstract void formatData();private void saveToFile() {System.out.println("Saving data to file...");}
}// 子類實現
public class CsvExporter extends DataExporter {@Overrideprotected void prepareData() { ... }@Overrideprotected void formatData() { ... }
}

5. 策略模式(Strategy Pattern)

MyBatis 中的應用

  • Executor 類型選擇:根據配置選擇 SIMPLE, REUSE, BATCH 等執行策略。
  • TypeHandler 選擇:根據 Java 類型和 JDBC 類型動態選擇處理器。

日常開發借鑒

  • 場景:需根據不同條件切換算法或策略。
  • 示例:排序算法選擇(快排、歸并排序)、支付方式(支付寶、微信)。
// 策略模式示例:支付方式
public interface PaymentStrategy {void pay(double amount);
}public class AlipayStrategy implements PaymentStrategy { ... }
public class WechatPayStrategy implements PaymentStrategy { ... }public class PaymentContext {private PaymentStrategy strategy;public PaymentContext(PaymentStrategy strategy) { this.strategy = strategy; }public void executePay(double amount) { strategy.pay(amount); }
}// 使用
PaymentContext context = new PaymentContext(new AlipayStrategy());
context.executePay(100.0);

6. 裝飾器模式(Decorator Pattern)

MyBatis 中的應用

  • Cache 實現:通過 LruCache, FifoCache 等裝飾器為緩存添加特性。
  • Connection 包裝:使用 PooledConnection 裝飾原生連接,實現連接池管理。

日常開發借鑒

  • 場景:動態為對象添加功能,避免繼承導致的類膨脹。
  • 示例:增強 IO 流(緩沖、加密)、為服務添加日志或限流功能。
// 裝飾器示例:帶加密功能的輸入流
public class EncryptedInputStream extends InputStream {private InputStream wrappedStream;public EncryptedInputStream(InputStream stream) { this.wrappedStream = stream; }@Overridepublic int read() throws IOException {int data = wrappedStream.read();return decrypt(data); // 解密邏輯}private int decrypt(int data) { ... }
}// 使用
InputStream rawStream = new FileInputStream("data.bin");
InputStream encryptedStream = new EncryptedInputStream(rawStream);

7. 責任鏈模式(Chain of Responsibility Pattern)

MyBatis 中的應用

  • 插件機制(Interceptor Chain):多個插件通過責任鏈模式依次攔截 Executor, StatementHandler 等方法調用。

日常開發借鑒

  • 場景:需多個處理器按順序處理同一請求。
  • 示例:過濾器鏈(權限校驗、日志記錄)、審批流程(多級審批)。
// 責任鏈示例:權限校驗鏈
public interface Filter {void doFilter(Request request, Response response, FilterChain chain);
}public class AuthFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {if (checkAuth(request)) {chain.doFilter(request, response); // 傳遞到下一個過濾器} else {response.setError("Unauthorized");}}
}// 使用
FilterChain chain = new FilterChain();
chain.addFilter(new AuthFilter()).addFilter(new LogFilter());
chain.doFilter(request, response);

8. 單例模式(Singleton Pattern)

MyBatis 中的應用

  • ErrorContext:線程級別的單例,記錄當前線程的 SQL 執行錯誤信息。
  • LogFactory:通過單例管理日志實現類。

日常開發借鑒

  • 場景:全局唯一對象(配置管理器、線程池、緩存實例)。
  • 示例:數據庫連接池、應用配置中心。
// 單例示例:雙重校驗鎖
public class DatabasePool {private static volatile DatabasePool instance;private DatabasePool() { ... }public static DatabasePool getInstance() {if (instance == null) {synchronized (DatabasePool.class) {if (instance == null) {instance = new DatabasePool();}}}return instance;}
}

總結

設計模式

MyBatis 應用場景

日常開發借鑒場景

工廠模式

SqlSessionFactory 創建對象

數據庫連接池、日志工廠

建造者模式

構建 Configuration 對象

復雜 DTO 構建、HTTP 請求參數封裝

動態代理

Mapper 接口實現

RPC 客戶端、AOP 切面

模板方法

Executor 執行流程

統一流程(支付、導出)

策略模式

不同 Executor 實現選擇

算法切換(排序、支付方式)

裝飾器模式

Cache 功能增強

IO 流增強(緩沖、加密)

責任鏈模式

插件攔截器鏈

過濾器鏈(權限、日志)

單例模式

ErrorContext 管理錯誤信息

全局配置、線程池管理

核心價值

  • 解耦:通過工廠、代理等模式隔離變化點。
  • 擴展性:策略、裝飾器模式支持靈活擴展功能。
  • 復用性:模板方法、責任鏈模式復用通用流程。

掌握這些模式的應用場景,能顯著提升代碼的可維護性和架構的靈活性。

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

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

相關文章

【unity游戲開發入門到精通——UGUI】Mask組件實現UGUI遮罩

注意:考慮到UGUI的內容比較多,我將UGUI的內容分開,并全部整合放在【unity游戲開發——UGUI】專欄里,感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言如何實現UI遮罩1、Mask組件2、實例3、注意 專欄推薦完結 前言 Mask遮罩是…

Github2025-05-04php開源項目日報 Top10

根據Github Trendings的統計,今日(2025-05-04統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量PHP項目10Shell項目1Vue項目1Java項目1ASP項目1SecLists - 安全測試人員的伴侶 創建周期:4375 天開發語言:PHP協議類型:MIT LicenseStar數量…

MyBatis 一對多與多對一映射詳解教程

一、基礎概念與場景 一對多(One-to-Many) ? 定義:一個父對象包含多個子對象。 例如:一個商品(Goods)對應多個商品詳情(GoodsDetail) ? 實體類表現:父類中包含 List&l…

ChatGPT:重塑人工智能交互范式的破曉之作

2022年11月30日,總部位于舊金山的研究公司OpenAI正式發布了ChatGPT——一款以病毒式傳播速度席卷全球的AI聊天機器人。它不僅能像人類一樣生成內容、回答問題和解決問題,更在推出后的兩個月內吸引了超過1億月活躍用戶,刷新了消費級技術應用的最快采用率紀錄。這一里程碑事件…

在項目中如何對Map List等對象序列化及反序列化

我們知道,在自定義類中,若想完成序列化必須要實現Serializable接口。 那么在實現后如何進行序列化呢? 一.普通對象 序列化: 1.首先我們要定義一個 序列化所需要的工具類 ObjectMapper //定義序列化所需要的工具類 轉化機器…

筆試專題(十五)

文章目錄 排序子序列題解代碼 消減整數題解代碼 最長公共子序列(二)題解代碼 排序子序列 題目鏈接 題解 1. 貪心 模擬 2. 1 2 3 2 2 應該是有兩個排列子序列的,所以i n-1時ret 3. 把水平的位置和上升部分,水平位置和下降部分分為一個排列子序列 代…

Amazon Bedrock Converse API:開啟對話式AI新體驗

Amazon Bedrock Converse API:開啟對話式AI新體驗 前言 在當今人工智能飛速發展的時代,對話式AI已成為眾多應用的核心組成部分。從智能客服到智能助手,對話式AI為用戶帶來了便捷且高效的交互體驗。而Amazon Bedrock Converse API的出現&…

【Springboot知識】Springboot計劃任務Schedule詳解

文章目錄 Spring Boot 定時任務從原理到實現詳解一、核心原理分析1. 架構分層2. 核心組件3. 線程模型 二、基礎實現步驟1. 添加依賴2. 主類配置3. 定時任務類 三、高級配置技巧1. 自定義線程池2. 動態配置參數3. 分布式鎖集成(Redis示例) 四、異常處理機…

MySQL:聯合查詢

目錄 一、笛卡爾積 ?二、內連接 三、外連接 (1)左外連接 (2)右外連接 (3)全外連接 四、自連接 五、子查詢 (1)單行子查詢 (2)多行子查詢 &…

深入理解 Cortex-M3 的內核寄存器組

每個 MCU 開發工程師一定都了解寄存器這個東西,以 STM32 為例,其擁有非常多的外設模塊,如串口、SPI、IIC 等等,如果要使用這些外設,使其按照我們的要求工作,就需要配置這些外設的寄存器,往這些寄…

網絡安全自動化:找準邊界才能筑牢安全防線

數字時代,企業每天要面對成千上萬的網絡攻擊。面對龐大的服務器群、分散的團隊和長期不重啟的設備,很多企業開始思考:哪些安全操作適合交給機器自動處理?哪些必須由人工把關?今天我們就用大白話聊聊這件事。 一、這些事…

C++負載均衡遠程調用學習之負載均衡算法與實現

目錄 01 lars 系統架構回顧 02 lars-lbAgentV0.4-route_lb處理report業務流程 03 lars-lbAgentV0.4-負責均衡判斷參數配置 04 lars-lbAgentV0.4-負載均衡idle節點的失敗率判斷 05 lars-lbAgentV0.4-負載均衡overload節點的成功率判斷 06 lars-lbAgentV0.4-負載均衡上報提交…

領略算法真諦: 多源bfs

嘿,各位技術潮人!好久不見甚是想念。生活就像一場奇妙冒險,而編程就是那把超酷的萬能鑰匙。此刻,陽光灑在鍵盤上,靈感在指尖跳躍,讓我們拋開一切束縛,給平淡日子加點料,注入滿滿的pa…

雷電模擬器-超好用的Windows安卓模擬器

一、雷電模擬器介紹 雷電模擬器是一款功能強大的軟件,它能夠在電腦上模擬出安卓手機系統,讓你可以在電腦上運行各類手機應用及游戲。其采用虛擬安卓手機操作界面,為玩家帶來了獨特的體驗。 (一)強大的兼容性 雷電模擬…

文章三《機器學習基礎概念與框架實踐》

文章3:機器學習基礎概念與框架實踐 ——從理論到代碼,用Scikit-learn構建你的第一個分類模型 一、機器學習基礎理論:三大核心類型 機器學習是人工智能的核心,通過數據讓計算機自動學習規律并做出預測或決策。根據學習方式,可分為三類: 1. 監督學習(Supervised Learni…

腦機接口技術:開啟人類與機器的全新交互時代

在科技飛速發展的今天,人類與機器的交互方式正經歷著前所未有的變革。從最初的鍵盤鼠標,到觸摸屏,再到語音控制,每一次交互方式的升級都極大地提升了用戶體驗和效率。如今,腦機接口(Brain-Computer Interfa…

8.2 GitHub企業級PDF報告生成實戰:ReportLab高級技巧與性能優化全解析

GitHub企業級PDF報告生成實戰:ReportLab高級技巧與性能優化全解析 GitHub Sentinel 高級功能實現:PDF 報告生成技術詳解 關鍵詞:PDF 報告生成, ReportLab 實戰, 結構化數據轉換, 容器化字體配置, 企業級報告模板 1. 需求分析與技術選型 PDF 報告生成需要滿足以下技術要求…

架構思維:構建高并發讀服務_基于流量回放實現讀服務的自動化測試回歸方案

文章目錄 引言一、升級讀服務架構,為什么需要自動化測試?二、自動化回歸測試系統:整體架構概覽三、日志收集1. 攔截方式2. 存儲與優化策略3. 架構進化 四、數據回放技術實現關鍵能力 五、差異對比對比方式靈活配置 六、三種回放模式詳解1. 離…

基于Spring Boot 3.0、ShardingSphere、PostgreSQL或達夢數據庫的分庫分表

要實現基于Spring Boot 3.0、ShardingSphere、PostgreSQL或達夢數據庫的分庫分表,首先需要對ShardingSphere進行一些基本配置。你提到的溯源碼、批次號等數據需要考慮到跨年數據的存儲,因此要設計一個能夠動態擴展的分表策略 添加ShardingSphere依賴 在…

位運算的應用

1. 判斷偶數&#xff0c;判斷最低位是0還是1即可&#xff0c;?求模快 x % 2 ! 0 //x正負都可以判斷&#xff1b;不?x%2 1&#xff0c;因為如果x為負奇數&#xff0c;x%2-1 (x & 0x1) 0 例如&#xff1a; int x; int main() { cin>>x; if((x & 0x1)0) cout<…