设计模式——传输对象模式

定义与概念

传输对象模式(Transfer Object Pattern),也称为值对象模式(Value Object Pattern),是一种设计模式。它主要用于在不同的层(如业务逻辑层和表示层)之间传递数据,以减少网络通信或方法调用的次数,提高系统性能。传输对象是一个简单的数据结构,它包含了一组相关的数据属性,并且可以被方便地序列化和传输。

结构组成

  • 业务对象(Business Object):
    这是实际处理业务逻辑的对象,它负责从数据源(如数据库)获取数据,并将数据封装到传输对象中。业务对象通常包含复杂的业务逻辑和数据访问操作。例如,在一个员工管理系统中,员工业务对象可能会从数据库中查询员工的基本信息、薪资信息等,然后将这些信息填充到一个员工传输对象中。
  • 传输对象(Transfer Object):
    传输对象是一个轻量级的数据结构,它包含了需要在不同层之间传递的数据属性。传输对象通常只包含数据成员和简单的访问器(getter 和 setter)方法,没有复杂的业务逻辑。例如,员工传输对象可能包含员工姓名、员工编号、薪资等属性,以及对应的获取和设置方法。
  • 客户端(Client):
    客户端是使用传输对象的部分,它可以是表示层(如用户界面)或者其他需要获取业务数据的模块。客户端从业务对象获取传输对象,然后使用传输对象中的数据进行展示或其他操作。例如,在一个 Web 应用中,客户端可能是一个 JSP 页面或者一个前端 JavaScript 脚本,它们从业务对象获取员工传输对象,然后将员工信息展示在网页上。

工作原理

当客户端需要获取业务数据时,它向业务对象发出请求。业务对象根据请求从数据源获取相关的数据,然后将这些数据封装到一个传输对象中。业务对象将传输对象返回给客户端。客户端接收到传输对象后,可以直接访问传输对象中的数据属性,而不需要再次与业务对象或数据源进行交互。这样可以减少客户端与业务对象之间的频繁通信,尤其是在远程调用或者跨网络的情况下,能够有效地提高系统性能。

代码示例

以下是一个简单的 C++ 示例,模拟一个图书管理系统中的传输对象模式。

  • 传输对象 - 图书信息(BookInfo)
class BookInfo {
private:std::string title;std::string author;int publicationYear;
public:BookInfo(const std::string& t, const std::string& a, int p) : title(t), author(a), publicationYear(p) {}std::string getTitle() const {return title;}std::string getAuthor() const {return author;}int getPublicationYear() const {return publicationYear;}
};
  • 业务对象 - 图书管理(BookManagement)
class BookManagement {
public:BookInfo getBookInfo(int bookId) {// 假设这里从数据库或者其他数据源获取图书信息// 为了简单起见,我们直接返回一个模拟的图书信息std::string title = "C++ Primer";std::string author = "Stanley Lippman";int publicationYear = 2012;return BookInfo(title, author, publicationYear);}
};
  • 客户端使用示例
int main() {BookManagement bookManagement;BookInfo bookInfo = bookManagement.getBookInfo(1);std::cout << "图书标题: " << bookInfo.getTitle() << std::endl;std::cout << "图书作者: " << bookInfo.getAuthor() << std::endl;std::cout << "出版年份: " << bookInfo.getPublicationYear() << std::endl;return 0;
}

优点

  • 减少网络开销和方法调用次数:
    在分布式系统或者多层架构的应用中,传输对象可以一次性传递多个数据属性,避免了多次调用远程方法或者跨网络获取单个数据属性的情况,从而减少了网络通信开销,提高了系统性能。例如,在一个企业级的 Web 服务应用中,通过使用传输对象可以将多个相关的数据作为一个整体在不同的服务之间传递,减少了服务之间的通信次数。
  • 解耦数据传递和业务逻辑:
    传输对象将数据封装起来,使得客户端只需要关注数据本身,而不需要了解业务对象的内部业务逻辑和数据访问方式。这使得客户端和业务对象之间的耦合度降低,便于代码的维护和扩展。例如,在一个软件系统中,当业务对象的内部数据存储方式或者业务逻辑发生变化时,只要传输对象的接口不变,客户端代码通常不需要进行修改。
  • 提高代码的可读性和可维护性:
    传输对象是一个简单的数据结构,它的代码通常比较简洁易懂。在客户端代码中,使用传输对象可以使数据的访问和操作更加直观,提高了代码的可读性。同时,由于传输对象将相关的数据组合在一起,也便于对数据进行统一的管理和维护。

缺点

  • 可能导致数据不一致:
    如果传输对象的数据在客户端被修改,而没有及时更新到业务对象或者数据源中,可能会导致数据不一致的情况。例如,在一个库存管理系统中,客户端通过传输对象获取了商品的库存数量,然后在客户端修改了库存数量,但没有将修改后的数据同步到业务对象和数据库中,就会出现数据不一致的问题。
  • 增加代码复杂度(在一定程度上):
    需要额外创建和维护传输对象类,对于简单的应用场景,可能会增加不必要的代码量和复杂度。例如,在一个小型的命令行工具中,如果只有少量的数据需要传递,使用传输对象模式可能会使代码变得更加复杂,而没有带来明显的性能提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477712.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调试器 gdb/cgdb 的使用

一. touch mycode.c vim mycode.c cgdb 下载 Ubuntu&#xff1a;sudo apt-get install -y cgdb Centos: sudo yum install -y cgdb Linux 下我们编译好的代码无法直接调试 g/gcc 默认的工作模式是release模式 程序要调试&#xff0c;必须是debug模式&#xff0c;编译时…

通过DataWorks实现MaxCompute跨项目迁移

本文为您介绍如何配置不同MaxCompute项目并实现数据迁移。 背景信息 本文使用的被迁移的原始项目为教程《简单用户画像分析&#xff08;MaxCompute版&#xff09;》中的WorkShop2023项目&#xff0c;您需要再创建一个迁移目标项目&#xff0c;用于存放原始项目的表、资源、配置…

【Linux】安装cuda

一、安装nvidia驱动 # 添加nvidia驱动ppa库 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update# 查找推荐版本 sudo ubuntu-drivers devices# 安装推荐版本 sudo apt install nvidia-driver-560# 检验nvidia驱动是否安装 nvidia-smi 二、安装cudatoolkit&…

Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive

前言 ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型&#xff0c;而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象&#xff0c;但 Vue3 官方文档更推荐使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;…

ctfshow-Misc入门(1-16)

misc1 查看图片得到flag misc2 1、打开文本&#xff0c;发现以“塒NG”开头 3、修改文件格式为png格式 4、查看图片&#xff0c;得到flag *遇到的问题&#xff1a;无法直接修改后缀名 *解决方法&#xff1a;需要点击文件夹&#xff0c;然后点击查看&#xff0c;将文件拓…

自动驾驶概念

1.线控底盘 由五大系统构成&#xff1a;线控转向、线控制动系统、线控换挡、线控油门踏板以及线控悬架。 2.自动驾驶分级 L1级别&#xff0c;也被称作驾驶支援阶段。在这一阶段&#xff0c;车辆系统能够根据驾驶环境来辅助驾驶者进行方向盘操作或减速操作中的一项&#xff0c…

【C】错误的变量定义导致sprintf()‌输出错误

问题描述 刚刚写一个用AT指令透传相关的函数&#xff0c;需要用到sprintf()‌拼接字符串。 结果发现sprintf()‌拼接出来的内容是错误的&#xff0c;简化后的代码如下&#xff1a; const char AT_CIPSEND_FIX_LENGTH_HEADER[11] "ATCIPSEND"; // 错误的&#xff0…

【Pytest+Yaml+Allure】实现接口自动化测试框架

一、框架思想 requestsyamlpytestallure实现接口自动化框架。结合数据驱动和分层思想&#xff0c;将代码与数据分离&#xff0c;易维护&#xff0c;易上手。使用yaml编写编写测试用例&#xff0c;利用requests库发送请求&#xff0c;使用pytest管理用例&#xff0c;allure生成…

内网渗透横向移动1

1.信息收集 &#xff08;1&#xff09;判断域控 shell net time /domain shell ping OWA2010CN-God.god.org &#xff08;2&#xff09;主机探测 浏览探测->网络探测 主机列表显示&#xff1a; &#xff08;3&#xff09;域用户收集&#xff1a; shell net user /domain…

C++初阶——类和对象(下)

目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值&#xff0c;还有一种方式——初始化列表&#xff0c; 初始化列…

数据指标与标签在数据分析中的关系与应用

导读&#xff1a;分享数据指标体系的文章很多&#xff0c;但讲数据标签的文章很少。实际上&#xff0c;标签和指标一样&#xff0c;是数据分析的左膀右臂&#xff0c;两者同样重要。实际上&#xff0c;很多人分析不深入&#xff0c;就是因为缺少对标签的应用。今天系统的讲解下…

Exploring Prompt Engineering: A Systematic Review with SWOT Analysis

文章目录 题目摘要简介方法论背景相关工作评估结论 题目 探索快速工程&#xff1a;基于 SWOT 分析的系统评价 论文地址&#xff1a; https://arxiv.org/abs/2410.12843 摘要 在本文中&#xff0c;我们对大型语言模型 (LLM) 领域的提示工程技术进行了全面的 SWOT 分析。我们强…

Android 常用命令和工具解析之内存相关

目录 1 基本概念 1.1 PSS & RSS & USS & VSS 1.1.1 PSS 1.1.2 RSS 1.2 Dirty & Clean & SwapPss 1.2.1 Private Dirty 1.2.2 Private Clean 1.2.3 SwapPss Dirty 1.3 Swap & buffers & cache 1.3.1 Swap 1.3.2 buffers 1.3.3 cache 2…

使用Go 语言连接并操作 MySQL 数据库

新建项目&#xff0c;我这里使用的vscode&#xff1a; 1.新建项目初始化&#xff1a; 手动创建工程文件夹go安装目录->src->projectName 在项目下创建 main.go文件&#xff1a; 在vscode中点击文件->打开文件夹&#xff0c;选择刚刚新建的文件夹。打开后&#xff0…

YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org…

从零开始-VitePress 构建个人博客上传GitHub自动构建访问

从零开始-VitePress 构建个人博客上传GitHub自动构建访问 序言 VitePress 官网&#xff1a;VitePress 中文版 1. 什么是 VitePress VitePress 是一个静态站点生成器 (SSG)&#xff0c;专为构建快速、以内容为中心的站点而设计。简而言之&#xff0c;VitePress 获取用 Markdown…

使用Notepad++工具去除重复行

使用Notepad工具去除重复行 参考链接&#xff1a;https://blog.csdn.net/londa/article/details/108981396 一 、使用正则表达式 1、对文本进行排序&#xff0c;让重复行排在一起 2、使用正则表达式替换&#xff08;注意&#xff09;^(.*?)$\s?^(?.*^\1$) 在替换时选择正…

RabbitMQ和RocketMQ相关面试题

RabbitMQ和RocketMQ面试题 RabbitMQ1.RabbitMQ各部分角色2.如何确保RabbitMQ消息的可靠性&#xff1f;3.什么样的消息会成为死信&#xff1f;4.死信交换机的使用场景是什么&#xff1f;5.TTL6.延迟队列7.消息堆积问题8.MQ集群 RocketMQ1.RocketMQ各部分角色2.RocketMQ如何保证高…

【机器学习chp5】线性回归

推荐文章1&#xff0c;三种角度详细分析了L1&#xff0c;L2正则化的本质。 【王木头 L1、L2正则化】三个角度理解L1、L2正则化的本质-CSDN博客 推荐文章2&#xff0c;其中有各种梯度下降的优化算法分析。 【王木头梯度下降法优化】随机梯度下降、牛顿法、动量法、Nesterov、…

【AI系统】GPU 架构回顾(从2018年-2024年)

Turing 架构 2018 年 Turing 图灵架构发布&#xff0c;采用 TSMC 12 nm 工艺&#xff0c;总共 18.6 亿个晶体管。在 PC 游戏、专业图形应用程序和深度学习推理方面&#xff0c;效率和性能都取得了重大进步。相比上一代 Volta 架构主要更新了 Tensor Core&#xff08;专门为执行…