模塊方法模式(Module Method Pattern)

🧠 模塊方法模式(Module Method Pattern)

模塊方法模式是一種結構型設計模式,它將復雜的操作分解成一系列相對簡單、獨立且單一職責的模塊。每個模塊負責完成一種具體的操作,其他模塊或系統可以通過調用這些模塊的公開方法來執行特定任務。

這種模式通常用于解決代碼復雜性過高的問題,通過將系統分解為多個模塊,使每個模塊有清晰的職責和功能。


🎯 為什么需要模塊方法模式?

  1. 降低復雜度:系統過于復雜時,模塊方法模式可以將系統劃分為多個模塊,每個模塊負責具體的業務邏輯。這樣可以降低單個模塊的復雜度,便于維護。
  2. 增強模塊化:將不同功能的模塊獨立出來,模塊之間通過公開方法進行交互。每個模塊的實現相對獨立,可以提升系統的可擴展性。
  3. 提高可維護性:各個模塊具有明確的責任,系統出現問題時,可以只關注出問題的模塊,而不需要了解整個系統的實現細節。
  4. 支持代碼重用:獨立模塊可以在其他系統中復用,只需調用模塊方法即可。

? 優缺點分析

? 優點? 缺點
模塊化設計使得系統容易擴展當系統中模塊較多時,管理和維護可能變得復雜
代碼的可讀性和可維護性較高模塊之間的接口可能會產生一定的耦合
便于測試每個模塊的功能如果模塊過于獨立,可能導致功能重復或冗余
便于集成第三方庫系統啟動時可能會加載過多的模塊,影響性能

🧩 Python 示例:學生管理系統

我們將通過一個學生管理系統來示例模塊方法模式。系統中有三個主要功能模塊:

  1. 學生信息模塊:管理學生的信息(如姓名、年齡等)。
  2. 成績模塊:管理學生的成績。
  3. 課程模塊:管理課程信息。

每個模塊都有自己的方法,其他模塊或系統通過調用這些方法來執行相應的任務。

🎯 1?? 學生信息模塊(Student Module)

class StudentModule:def __init__(self):self.students = {}def add_student(self, student_id: int, name: str, age: int):"""添加學生信息"""self.students[student_id] = {'name': name, 'age': age}def get_student_info(self, student_id: int):"""獲取學生信息"""return self.students.get(student_id, "Student not found")
  • add_student():添加學生信息。
  • get_student_info():獲取學生信息。

🎯 2?? 成績模塊(Grade Module)

class GradeModule:def __init__(self):self.grades = {}def add_grade(self, student_id: int, course_name: str, grade: float):"""為學生添加成績"""if student_id not in self.grades:self.grades[student_id] = {}self.grades[student_id][course_name] = gradedef get_grades(self, student_id: int):"""獲取學生的成績"""return self.grades.get(student_id, "Grades not found")
  • add_grade():為學生添加成績。
  • get_grades():獲取學生成績。

🎯 3?? 課程模塊(Course Module)

class CourseModule:def __init__(self):self.courses = {}def add_course(self, course_id: int, course_name: str):"""添加課程"""self.courses[course_id] = course_namedef get_course_info(self, course_id: int):"""獲取課程信息"""return self.courses.get(course_id, "Course not found")
  • add_course():添加課程信息。
  • get_course_info():獲取課程信息。

🎯 4?? 上下文類(SchoolSystem)

上下文類將這些獨立的模塊整合在一起,提供一個接口,方便外部代碼調用每個模塊的功能。

class SchoolSystem:def __init__(self):self.student_module = StudentModule()self.grade_module = GradeModule()self.course_module = CourseModule()def add_student(self, student_id: int, name: str, age: int):self.student_module.add_student(student_id, name, age)def get_student_info(self, student_id: int):return self.student_module.get_student_info(student_id)def add_grade(self, student_id: int, course_name: str, grade: float):self.grade_module.add_grade(student_id, course_name, grade)def get_grades(self, student_id: int):return self.grade_module.get_grades(student_id)def add_course(self, course_id: int, course_name: str):self.course_module.add_course(course_id, course_name)def get_course_info(self, course_id: int):return self.course_module.get_course_info(course_id)
  • SchoolSystem 類整合了所有的功能模塊。外部調用 SchoolSystem 的方法時,實際上是通過它來調用各個模塊的方法。

🎯 5?? 客戶端代碼:使用學校系統

# 創建學校系統對象
school_system = SchoolSystem()# 添加學生信息
school_system.add_student(1, "Alice", 20)
school_system.add_student(2, "Bob", 22)# 添加課程信息
school_system.add_course(101, "Math")
school_system.add_course(102, "History")# 添加成績信息
school_system.add_grade(1, "Math", 90)
school_system.add_grade(1, "History", 85)
school_system.add_grade(2, "Math", 75)# 獲取學生信息
print(school_system.get_student_info(1))  # 獲取Alice的信息# 獲取學生成績
print(school_system.get_grades(1))  # 獲取Alice的成績
print(school_system.get_grades(2))  # 獲取Bob的成績# 獲取課程信息
print(school_system.get_course_info(101))  # 獲取Math課程信息

? 輸出結果

{'name': 'Alice', 'age': 20}
{'Math': 90, 'History': 85}
{'Math': 75}
Math

🧭 類圖(Mermaid)

管理
管理
管理
StudentModule
+add_student(student_id: int, name: str, age: int)
+get_student_info(student_id: int)
GradeModule
+add_grade(student_id: int, course_name: str, grade: float)
+get_grades(student_id: int)
CourseModule
+add_course(course_id: int, course_name: str)
+get_course_info(course_id: int)
SchoolSystem
+add_student(student_id: int, name: str, age: int)
+get_student_info(student_id: int)
+add_grade(student_id: int, course_name: str, grade: float)
+get_grades(student_id: int)
+add_course(course_id: int, course_name: str)
+get_course_info(course_id: int)

🧭 流程圖(Mermaid)

User SchoolSystem StudentModule GradeModule CourseModule add_student(1, "Alice", 20) add_student(1, "Alice", 20) add_course(101, "Math") add_course(101, "Math") add_grade(1, "Math", 90) add_grade(1, "Math", 90) get_student_info(1) get_student_info(1) {"name": "Alice", "age": 20} get_grades(1) get_grades(1) {"Math": 90} User SchoolSystem StudentModule GradeModule CourseModule

🧠 應用場景總結

場景示例
功能模塊化系統中需要拆分為多個相互獨立的功能模塊,各模塊之間通過接口互相協作
大型應用大型系統,功能多且復雜,模塊化有助于解耦和分工
可擴展性強需要隨時添加新的功能模塊時(如增加新的支付方式、報告類型等)

? 總結口訣

模塊方法模式
? 將系統中的不同功能封裝為模塊,每個模塊具有獨立的職責。通過調用模塊的公開方法來完成相應的操作,提升系統的可擴展性和可維護性。


如果你對這個模式或代碼有疑問,或想了解更復雜的用例,隨時告訴我!

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

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

相關文章

Python中的JSON庫,詳細介紹與代碼示例

目錄 1. 前言 2. json 庫基本概念 3. json 的適應場景 4. json 庫的基本用法 4.1 導 json入 模塊 4.2 將 Python 對象轉換為 JSON 字符串 4.3 將 JSON 字符串轉換為 Python 對象 4.4 將 Python 對象寫入 JSON 文件 4.5 從 JSON 文件讀取數據 4.6 json 的其他方法 5.…

網狐旗艦大聯盟組件源碼私測筆記:結構分層、UI重構與本地實操全流程

作為一套衍生于傳統網狐架構的源碼版本,大聯盟這套源碼組件可謂是在經典基礎上進行了深度重塑。與老版死板的框架風格不同,它不僅對界面做了大刀闊斧的重構,還在組件層級的組織上做了優化。本文將基于一整套源碼進行深度解析,強調…

STM32 PulseSensor心跳傳感器驅動代碼

STM32CubeMX中準備工作: 1、設置AD 通道 2、設置一個定時器中斷,間隔時間2ms,我這里采用的是定時器7 3、代碼優化01 PulseSensor.c文件 #include "main.h" #include "PulseSensor/PulseSensor.h"/******************…

C++項目容易犯錯的點

1. 矩陣q要先定義大小&#xff0c;再賦值。不可以直接賦值。下面這種方式是錯誤的Eigen::MatrixXd q&#xff1b;q<<1,2&#xff1b;正確的這樣的&#xff1a; Eigen::MatrixXd q(2,1); q<<1.4, 1.5; 2. 不要重復加載variables.h頭文件&#xff0c;這樣變量會被…

在阿里云 Ubuntu 24.04 上部署 RabbitMQ:一篇實戰指南

前言 RabbitMQ 是業界常用的開源消息中間件,支持 AMQP 協議,易于部署、高可用、插件豐富。本文以阿里云 ECS 上運行的 Ubuntu 24.04 LTS 為例,手把手帶你完成 RabbitMQ 從倉庫配置到運行的全流程,并分享在國內環境下常見的坑與對應解決方案。 環境概況 操作系統:Ubuntu …

【論文筆記】SOTR: Segmenting Objects with Transformers

【題目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【網…

MinIO實現https訪問

Windows下實現MinIO的https訪問. 首先需要自己解決證書問題, 這里可以是個人證書 也可以是花錢買的證書. 現在使用個人開發者證書舉例子。 將證書數據解壓到你知道的目錄之下 然后直接使用命令啟動MinIO start minio.exe server --certs-dir D:\xxxxx\tools\certs …

基于 jQuery 實現靈活可配置的輸入框驗證功能

在 Web 表單開發中&#xff0c;輸入框驗證是保障數據準確性和安全性的關鍵環節。無論是用戶注冊、信息提交還是數據錄入場景&#xff0c;都需要對用戶輸入內容進行合法性檢查。本文將介紹如何使用 HTML、CSS 和 jQuery 構建一個可靈活配置的輸入框驗證系統&#xff0c;輕松應對…

Kotlin 04Flow stateIn 和 shareIn的區別

一 Kotlin Flow 中的 stateIn 和 shareIn 一、簡單比喻理解 想象一個水龍頭&#xff08;數據源&#xff09;和幾個水杯&#xff08;數據接收者&#xff09;&#xff1a; 普通 Flow&#xff08;冷流&#xff09;&#xff1a;每個水杯來接水時&#xff0c;都要重新打開水龍頭從…

WebRTC 服務器之SRS服務器概述和環境搭建

1.概述 SRS&#xff08;Simple Realtime Server&#xff09;是一款高性能、跨平臺的流媒體服務器&#xff0c;支持多種協議&#xff0c;包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 和 GB28181。本文介紹了 SRS&#xff0c;包括其用途、關鍵功能、架構和支持協議。SRS 旨…

Dify - Embedding Rerank

注意&#xff1a;v100顯卡會出現不適配&#xff0c;不推薦使用 1. 安裝 Docker ubuntu 22.04 docker 安裝&使用_ubuntu22.04 安裝docker-CSDN博客 2. 安裝vllm pip install -U xformers torch torchvision torchaudio triton --index-url https://download.pytorch.org/w…

LeetCode:鏈表的中間結點

1、題目描述 給你單鏈表的頭結點 head &#xff0c;請你找出并返回鏈表的中間結點。 如果有兩個中間結點&#xff0c;則返回第二個中間結點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[3,4,5] 解釋&#xff1a;鏈表只有一個中間結點&#xff…

LabVIEW溫控系統熱敏電阻滯后問題

在 LabVIEW 構建的溫控系統中&#xff0c;熱敏電阻因熱時間常數大&#xff08;2 秒左右&#xff09;產生的滯后效應&#xff0c;致使控溫出現超調與波動。在不更換傳感器的前提下&#xff0c;可從算法優化、硬件調整和系統設計等維度著手解決。 ? 一、算法優化? 1. 改進 PI…

技術犯規計入個人犯規嗎·棒球1號位

在棒球運動中&#xff0c;雖然沒有“技術犯規”這一特定術語&#xff0c;但存在多種違規行為或違反規則的情況&#xff0c;通常會導致判罰或處罰。以下是常見的違規行為及相關規則&#xff1a; 1. 投手違規&#xff08;Balk&#xff09; 定義&#xff1a;投手在壘上有跑壘員時…

Python核心技巧 類與實例:面向對象編程的基石

、核心概念圖解 &#x1f3af; 類 vs 實例 類&#xff1a;對象的藍圖&#xff08;如"汽車設計圖"&#xff09; 實例&#xff1a;類的具體實現&#xff08;如"你的特斯拉Model 3"&#xff09; class MyClass: # 類聲明 count 0 # 類…

協程補充---viewModelScope 相關知識點

viewModelScope.launch 默認在 Dispatchers.Default 線程池執行Dispatchers.Default 是一個后臺線程池&#xff0c;專門用于 CPU 密集型任務如果需要在主線程執行&#xff0c;必須顯式指定 Dispatchers.Main remember 是 Compose 的狀態管理函數(queueMenus) 是依賴項&#xff…

linux stm32mp157 GIC-V2 中斷處理過程分析

/* ** 中斷觸發時&#xff0c;調用的 handle_arch_irq 入口地址。 ** 因為此時&#xff0c;掛接的就是 gic_handle_irq 函數&#xff01;gic_handle_irq 是個全局函數指針&#xff0c; ** static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) ** 它是Lin…

動態指令參數:根據組件狀態調整指令行為

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

直方圖比較

目錄 1、直方圖比較的概念 2、直方圖比較的主要原因 3、典型應用場景 4、基礎直方圖比較 5、多通道直方圖比較 6、實時直方圖檢測 1、直方圖比較的概念 直方圖比較是通過數學方法計算兩個直方圖之間的相似度或差異度的技術。在計算機視覺中&#xff0c;直方圖是對圖像特征…

Windows11 VS code 安裝 Cline 調用 Github MCP 配置過程坑點匯總

背景 為了調研 MCP 在 windows 上如何使用本地的命令執行一些操作而實現自動化的過程&#xff0c;在 B 站視頻的指導下&#xff0c;進行相應填坑過程&#xff0c;最終運行起來&#xff0c;并實現 github 自動化編程并提交代碼的過程。 B 站 Cline 視頻演示 Cline Cline 是一…