当前位置: 首页 > news >正文

软件对象粒度控制与设计模式在其中作用的例子

在软件设计中,确定对象的粒度(Granularity)是一个重要的考量因素,它决定了对象的职责范围和复杂程度。粒度过细或过粗都可能影响系统的可维护性和性能。设计模式可以帮助我们在不同层面控制粒度和管理对象之间的交互。以下是对每种设计模式如何帮助控制粒度的详细说明,以及它们如何协助向不同粒度对象发送请求。

1. Facade 模式

粒度控制

  • 目的:Facade 模式通过提供一个统一的接口,使得客户端可以简化对一系列子系统的访问。
  • 实现:Facade 将多个子系统的交互逻辑封装在一个高层接口中,使得客户端不必直接与多个子系统交互,从而降低了复杂度。

请求发送

  • 面向过程:Facade 模式有助于向多个对象或子系统发送请求,但通常是在幕后完成的,客户端只与 Facade 对象交互。
  • 示例:在一个电商平台中,订单处理 Facade 可以封装支付、库存、物流等多个子系统的复杂交互,客户端只需调用 Facade 提供的方法即可完成一个订单的整个流程。

2. Flyweight 模式

粒度控制

  • 目的:Flyweight 模式通过共享对象来减少内存使用和对象创建的成本,适用于需要大量相似对象的情况。
  • 实现:Flyweight 模式将对象的状态分为内部状态(共享)和外部状态(不可共享),从而减少重复对象的数量。

请求发送

  • 面向对象:Flyweight 对象通常是被客户端直接使用的,但它们的状态和行为不同,客户端可能需要根据上下文提供外部状态。
  • 示例:在文档编辑器中,字体对象可以被设计为 Flyweight 对象,多个文字对象共享相同的字体对象,客户端在使用时需提供具体的文字内容。

3. Abstract Factory 模式

粒度控制

  • 目的:Abstract Factory 模式提供了创建一系列相关或依赖对象的接口,而不指定具体的类。
  • 实现:通过抽象工厂接口,客户端可以创建一组对象,而不需要知道具体的实现类,从而保持了对象家族的一致性。

请求发送

  • 面向对象:Abstract Factory 模式帮助创建一组粒度相似的对象,但并不直接发送请求,而是为这些对象的创建提供了一个接口。
  • 示例:在一个游戏系统中,抽象工厂可以创建不同主题的世界对象(如山地、海洋),客户端通过抽象工厂接口调用来获取对象家族。

4. Builder 模式

粒度控制

  • 目的:Builder 模式用于分步构建复杂对象,使得同样的构建过程可以创建不同的表示。
  • 实现:Builder 模式通过定义一个构造过程的抽象和具体实现,使得构建过程与表示分离。

请求发送

  • 面向对象:Builder 对象通常由客户端直接使用,以逐步构建复杂对象。构建完成后,Builder 将最终对象返回给客户端。
  • 示例:在创建一个复杂的文档对象时,可以使用 Builder 逐步添加段落、表格、图表等内容,最终生成完整的文档对象。

5. Visitor 模式

粒度控制

  • 目的:Visitor 模式允许你定义新的操作而不改变被访问对象的类。
  • 实现:Visitor 模式通过定义访问者和被访问者,使得新操作可以集中在一个类中,而不是分散在多个类中。

请求发送

  • 面向对象:Visitor 对象通常是被访问对象直接使用的,以执行特定的操作。被访问对象将自身传给 Visitor,Visitor 执行相应操作。
  • 示例:在图形编辑器中,Visitor 可以用于在图形对象上执行不同的操作(如渲染、计算面积),图形对象将自身传给 Visitor 以执行操作。

6. Command 模式

粒度控制

  • 目的:Command 模式将请求封装为对象,从而允许参数化客户端、队列化请求以及记录请求日志。
  • 实现:Command 模式通过定义命令接口和具体命令类,将请求动作和执行请求的对象分离。

请求发送

  • 面向对象:Command 对象通常由客户端创建并传递给接收者,接收者执行命令对象中的操作。
  • 示例:在一个智能家居系统中,命令对象可以封装开关灯的操作,客户端将命令对象传递给家居控制器,控制器执行对应的操作。

总结

确定对象的粒度是软件设计中的一个关键步骤,设计模式为我们提供了多种方法来管理对象的粒度和它们之间的交互。Facade 模式通过定义高层接口简化复杂交互,Flyweight 模式通过共享对象提高效率,Abstract Factory 模式帮助创建一组相关对象,Builder 模式分步构建复杂对象,Visitor 模式集中管理新操作,Command 模式封装请求。每种模式都在不同层面帮助设计者控制粒度并向不同粒度对象发送请求,从而提高系统的灵活性和可维护性。

相关文章:

软件对象粒度控制与设计模式在其中作用的例子

在软件设计中,确定对象的粒度(Granularity)是一个重要的考量因素,它决定了对象的职责范围和复杂程度。粒度过细或过粗都可能影响系统的可维护性和性能。设计模式可以帮助我们在不同层面控制粒度和管理对象之间的交互。以下是对每种…...

代码随想录算法训练营Day.3| 移除链表元素 设计链表 反转链表

长沙出差ing,今天的核心是链表,一个比较基础且重要的数据结构。对C的指针的使用,对象的创建,都比较考察,且重要。 203.移除链表元素 dummyNode虚拟头节点很重要,另外就是一个前后节点记录的问题。但是Leet…...

基于SSM的学生考勤管理系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...

制作gif动图并穿插到CSDN文章中

在我们编写文档时,需要放一些动图来增加我们文章的阅读性,在这里为大家推荐一款好用的软件LICEcap 一、下载LICEcap软件 安装包以百度网盘的形式放在了文章末尾,下载完成后,会出现下面的图标 二、如何操作 双击图标运行 会出现…...

字段值为null就不返回的注解

1. 导包 <dependency><groupId>com.fasterxml.jackson.module</groupId><artifactId>jackson-module-kotlin</artifactId> </dependency>2. 类上加注解 JsonInclude(value JsonInclude.Include.NON_NULL)3. 示例 Data JsonInclude(valu…...

spring-boot(整合aop)

第一步导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 日志依赖 <dependency><groupId>org.springframework.boot</groupI…...

qt QStatusBar详解

1、概述 QStatusBar是Qt框架提供的一个小部件&#xff0c;用于在应用程序窗口底部显示状态信息。它可以显示一些固定的文本和图标&#xff0c;并且可以通过API动态更新显示内容。QStatusBar通常是一个水平的窗口部件&#xff0c;能够显示多行文本内容&#xff0c;非常适合用于…...

Docker Compose部署Powerjob

整个工具的代码都在Gitee或者Github地址内 gitee&#xff1a;solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github&#xff1a;GitHub - ZeroNing/solomon-parent: 这个项目主要是…...

前端使用PDF.js把返回的base64或二进制文件流格式,实现pdf文件预览

pdf文件预览 简单了解PDF.js代码实现首先&#xff0c;引入依赖实现预览逻辑 简单了解PDF.js PDF.js是一个JavaScript库&#xff0c;可在浏览器中无插件显示PDF文件&#xff0c;提供缩放、翻页、文本搜索等功能。本文介绍了其基本使用方法和示例代码&#xff0c;如添加翻页和搜…...

如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?

以下是使用 Python 的爬虫技术获取淘宝天猫商品价格信息的两种常见方法&#xff1a; 方法一&#xff1a;使用 Selenium 一、环境准备&#xff1a; 安装 selenium 库&#xff1a;在命令行中运行 pip install selenium。下载浏览器驱动&#xff1a;如 ChromeDriver&#xff08;确…...

论文阅读笔记:Activating More Pixels in Image Super-Resolution Transformer

论文阅读笔记&#xff1a;Activating More Pixels in Image Super-Resolution Transformer 1 背景1.1 问题1.2 提出的方法 2 创新点3 方法4 模块4.1 混合注意力模块&#xff08;HAB&#xff09;4.2 重叠交叉注意力模块&#xff08;OCAB&#xff09;4.3 同任务预训练 5 效果5.1 …...

VSCode 与 HBuilderX 介绍

Visual Studio Code (VSCode) Visual Studio Code (VSCode) 是一款由 Microsoft 开发的源代码编辑器&#xff0c;支持多种编程语言&#xff0c;并且是免费和开源的。它在开发者社区中非常受欢迎&#xff0c;因其强大的功能和高度的可定制性而受到赞誉。 特点 轻量级且强大&am…...

《Vision Transformer with Deformable Attention》论文翻译

原文链接:https://doi.org/10.1109/cvpr52688.2022.00475 author{Zhuofan Xia and Xuran Pan and Shiji Song and Li Erran Li and Gao Huang} 一、介绍 Transformer最初是为了处理自然语言处理任务而提出的。最近&#xff0c;它在计算机视觉领域展示了巨大的潜力。先锋工作V…...

爬虫下载网页文夹

爬虫下载网页pdf文件 import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin from urllib.parse import urljoin, unquote from tqdm import tqdm # 设置网页的URL base_url "http://119/download/dzz/pdf/"# 创建保存文件的…...

深入探讨钉钉与金蝶云星空的数据集成技术

钉钉报销数据集成到金蝶云星空的技术案例分享 在企业日常运营中&#xff0c;行政报销流程的高效管理至关重要。为了实现这一目标&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将钉钉的行政报销数据无缝对接到金蝶云星空的付款单系统。本次案例将重点介绍如何通过API接…...

小语言模型介绍与LLM的比较

小模型介绍 小语言模型&#xff08;SLM&#xff09;与大语言模型&#xff08;LLM&#xff09;相比&#xff0c;具有不同的特点和应用场景。大语言模型通常拥有大量的参数&#xff08;如 GPT-3 拥有 1750 亿个参数&#xff09;&#xff0c;能够处理复杂的自然语言任务&#xff…...

ThreadLocal从入门到精通

1.ThreadLocal是什么 ThreadLocal 是 Java 提供的一个用于线程存储本地变量的类。它为每个线程提供独立的变量副本&#xff0c;确保变量在多线程环境下的线程安全。每个线程访问 ThreadLocal 时&#xff0c;都会有自己专属的变量副本&#xff0c;互不干扰&#xff0c;避免了并…...

小新学习k8s第六天之pod详解

一、资源限制 Pod是k8s中的最小的资源管理组件&#xff0c;pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。k8s中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和Deployment等…...

9、node.js和Lowdb

六、Lowdb 一个简单的Json数据库 6.1安装lowdb npm i lowdb1.0.06.2初始化 //引入lowdb const low require(lowdb) const FileSync require(lowdb/adapters/FileSync) //指定数据文件 const adapter new FileSync(db.json) //创建db对象 const db low(adapter)//初始化…...

WebAPI编程(第五天,第六天,第七天)

WebAPI编程&#xff08;第五天&#xff0c;第六天&#xff0c;第七天&#xff09; **day05 - Web APIs****1.1. **元素偏移量 offset 系列1.1.1 offset 概述1.1.2 offset 与 style 区别offsetstyle 1.1.3 案例&#xff1a;获取鼠标在盒子内的坐标1.1.4 案例&#xff1a;模态框拖…...

AI成为核心经济驱动力的四大标志与落地路径

1. 这不是技术升级&#xff0c;而是一场经济结构的静默重置“AI’s Next Strategic Phase: From Lab Curiosity to Core Economy Driver”——这个标题里没有一行代码&#xff0c;没提一个模型参数&#xff0c;却比任何benchmark跑分都更刺眼。它说的不是“大模型又涨了几个点”…...

Python量化投资终极指南:MOOTDX让通达信数据获取变得如此简单

Python量化投资终极指南&#xff1a;MOOTDX让通达信数据获取变得如此简单 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 还在为股票数据的获取而烦恼吗&#xff1f;你是否曾经花费数小时研究复杂…...

ViGEmBus虚拟游戏控制器驱动:Windows游戏输入的革命性解决方案

ViGEmBus虚拟游戏控制器驱动&#xff1a;Windows游戏输入的革命性解决方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 在Windows游戏世界中&#xff0c;…...

Rescuezilla:3步轻松搞定系统备份与恢复的瑞士军刀

Rescuezilla&#xff1a;3步轻松搞定系统备份与恢复的瑞士军刀 【免费下载链接】rescuezilla The Swiss Army Knife of System Recovery 项目地址: https://gitcode.com/gh_mirrors/re/rescuezilla 当你面对电脑系统崩溃、硬盘损坏或数据丢失的紧急情况时&#xff0c;是…...

实战指南:如何构建企业级Chrome自动化测试环境

实战指南&#xff1a;如何构建企业级Chrome自动化测试环境 【免费下载链接】chrome-for-testing 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-for-testing Chrome for Testing 是Google专为浏览器自动化测试设计的专业解决方案&#xff0c;解决了传统Chrome版…...

3步轻松下载B站4K大会员视频:开源工具完全使用指南

3步轻松下载B站4K大会员视频&#xff1a;开源工具完全使用指南 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站4K高清视频需…...

Photoshop到URP的法线验证闭环:跨引擎法线贴图精准调试指南

1. 这不是个“一键生成法线”的玩具&#xff0c;而是一套跨引擎、跨工作流的材质验证闭环你有没有遇到过这样的情况&#xff1a;在 Photoshop 里辛苦调出一张完美的 Normal Map&#xff0c;导入 Unity 后却发现高光方向反了、边缘发灰、贴图在 Decal 上拉伸变形&#xff0c;甚至…...

4.7 Spark SQL函数分类与应用

本次实战涵盖了三大核心内容&#xff1a;内置函数、自定义函数&#xff08;UDF&#xff09;和开窗函数。 内置函数是数据处理的基础&#xff0c;包括字符串、日期、数学、聚合等10大类&#xff0c;可通过DataFrame API或SQL语句两种方式调用&#xff0c;满足多样化的数据转换需…...

如何在10分钟内搭建个人游戏串流服务器:Sunshine跨平台游戏流媒体完全指南

如何在10分钟内搭建个人游戏串流服务器&#xff1a;Sunshine跨平台游戏流媒体完全指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否梦想过在任何设备上畅玩PC游戏&#x…...

STM32 HAL库驱动DS18B20避坑指南:单总线时序不准?试试用定时器精准延时

STM32 HAL库驱动DS18B20避坑指南&#xff1a;单总线时序不准&#xff1f;试试用定时器精准延时 在嵌入式开发中&#xff0c;温度传感器DS18B20因其单总线接口和数字输出特性广受欢迎。然而&#xff0c;许多开发者在使用STM32 HAL库驱动DS18B20时&#xff0c;常遇到温度读取失败…...