模块方法模式(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.mzph.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 是一…