设计模式-传输对象模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 传输对象模式和序列化的区别
    • 代码示例
      • Java实现传输对象模式
      • Python实现传输对象模式
    • 传输对象模式在spring中的应用


模式介绍

传输对象模式(Transfer Object Pattern)是一种设计模式,用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。这种设计模式通常用于将多个属性打包到一个对象中,以便通过网络传输。

传输对象是一个具有getter/setter方法的简单的POJO类,它是可序列化的,所以它可以通过网络传输。它没有任何的行为,只是用于存储数据。服务器端的业务类通常从数据库读取数据,然后填充POJO,并把它发送到客户端或按值传递它。对于客户端,传输对象是只读的,客户端可以创建自己的传输对象,并把它传递给服务器,以便一次性更新数据库中的数值。

这种设计模式的实体包括业务对象(Business Object)和传输对象(Transfer Object)。业务对象是为传输对象填充数据的业务服务,而传输对象是一个简单的POJO,只有设置/获取属性的方法。客户端可以发送请求或者发送传输对象到业务对象。

通过使用传输对象模式,可以提高数据传输的效率和可靠性,同时降低网络通信的复杂性和风险。此外,这种设计模式还可以方便地实现数据的封装、解封装和序列化操作,有利于实现分布式系统的数据交换和通信。

在这里插入图片描述

模式特点

传输对象模式的优点包括:

  1. 数据隔离:通过VO(值对象)和BO(业务对象),可以有效地进行数据隔离,提高一定的安全性。
  2. 减少远程调用次数:通过在单个远程调用中传输更多的数据,应用程序可以减少远程调用次数,从而提高性能。
  3. 简化程序代码:使用传输对象的模式可以使代码更简单,可读性更高。

然而,传输对象模式也存在一些缺点:

  1. 增加复杂性:由于需要兼容多个版本的程序,可能需要创建更多的实体类来适应各个版本的程序,这会让程序变得更加复杂。
  2. 代码量和传输对象增加:不同层返回不同的实体会导致代码量和相关的传输对象增加,开发工作量也会增加,并且在某种程度导致系统的复杂性提升。
  3. 手动维护和创建传输对象:目前没有比较好的工具去自动创建和根据不同UI需求自定义配置传输对象。

传输对象模式在处理复杂的数据传输需求时非常有用,但也需要考虑其可能带来的问题和挑战。

在这里插入图片描述

应用场景

传输对象模式的应用场景包括但不限于:

  1. Web开发:在Web开发中,传输对象模式常用于处理客户端和服务器之间的数据交换。客户端通过传输对象将多个属性的数据一次性传递给服务器进行处理,提高数据传输的效率和可靠性。
  2. 分布式系统:在分布式系统中,传输对象模式被广泛用于不同模块或服务之间传输数据,实现数据的封装、解封装和序列化操作,确保数据的完整性和一致性。
  3. 微服务架构:在微服务架构中,传输对象模式可以简化不同服务之间的数据传输和通信,降低网络通信的开销。
  4. 前后端数据交互:在前后端数据交互中,传输对象模式可以用于封装和传递数据,确保数据的完整性和一致性,并在不同的上下文中转换数据格式和结构。

在这里插入图片描述

传输对象模式和序列化的区别

传输对象模式和序列化在某些方面是相似的,但它们的目的和应用场景有所不同。

传输对象模式主要关注于将多个相关的属性打包成一个对象,以便一次性传输。这种模式通常用于远程调用或分布式系统中不同服务之间的数据交换。传输对象模式强调的是数据的封装、解封装和传输过程。

而序列化关注的是将对象的状态转换为字节流,以便在网络上传输或存储到磁盘等持久化存储介质中。序列化的主要目的是为了方便数据的存储和传输,同时确保数据的完整性和一致性。序列化通常用于在网络中传输对象或将对象保存到文件或数据库中。

传输对象模式更侧重于将多个相关的属性打包成一个对象进行传输,而序列化则是将对象的状态转换为字节流以便存储或传输。在实际应用中,传输对象模式可能会使用序列化技术来实现对象的转换。

在这里插入图片描述

代码示例

Java实现传输对象模式

在Java中实现传输对象模式,你可以创建一个简单的POJO类来表示传输对象,并使用Java序列化机制进行对象的序列化和反序列化。

下面是一个简单的示例,演示如何实现传输对象模式:

  1. 创建一个传输对象类(TransferObject):
import java.io.Serializable;public class TransferObject implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;public TransferObject() {}public TransferObject(String name, int age) {this.name = name;this.age = age;}// Getter and setter methods for name and agepublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
  1. 在客户端和服务器之间传输该对象:

客户端代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class Client {public static void main(String[] args) throws Exception {TransferObject transferObject = new TransferObject("John Doe", 30);FileOutputStream fileOut = new FileOutputStream("transferObject.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(transferObject);out.close();fileOut.close();System.out.println("Serialized data is saved in transferObject.ser");}
}

服务器端代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class Server {public static void main(String[] args) throws Exception {FileInputStream fileIn = new FileInputStream("transferObject.ser");ObjectInputStream in = new ObjectInputStream(fileIn);TransferObject transferObject = (TransferObject) in.readObject();in.close();fileIn.close();System.out.println("Deserialized Person...");System.out.println("Name: " + transferObject.getName());System.out.println("Age: " + transferObject.getAge());}
}

Python实现传输对象模式

在Python中,可以使用类来实现传输对象模式。以下是一个示例:

class TransferObject:def __init__(self, name, age):self.name = nameself.age = age

使用这个类,你可以创建一个TransferObject对象,并将多个属性打包到该对象中。例如:

# 创建TransferObject对象
transfer_object = TransferObject("John Doe", 30)

然后,你可以将该对象序列化为JSON格式,以便在网络上传输或保存到文件等持久化存储介质中。在Python中,可以使用json模块来实现序列化和反序列化操作:

import json# 将TransferObject对象序列化为JSON格式
json_data = json.dumps(transfer_object.__dict__)# 从JSON格式反序列化回TransferObject对象
transfer_object = json.loads(json_data, object_hook=lambda d: TransferObject(d['name'], d['age']))

这样,你就可以使用传输对象模式在Python中实现数据的封装、解封装和传输过程。

在这里插入图片描述

传输对象模式在spring中的应用

传输对象模式在Spring框架中有广泛的应用,特别是在Spring Web MVC和Spring RESTful Web服务中。

在Spring Web MVC中,传输对象模式通常用于处理HTTP请求和响应。Spring MVC框架使用Java对象作为模型,通过传输对象将多个属性封装到一个对象中,并将其传递给视图进行呈现。在处理表单提交时,可以使用Spring的绑定机制将表单数据自动绑定到传输对象中,从而简化了表单数据的处理过程。

在Spring RESTful Web服务中,传输对象模式用于构建RESTful API的响应。通过使用传输对象,可以将多个相关的属性封装到一个对象中,并将其作为响应返回给客户端。Spring RESTful Web服务提供了多种数据传输对象(DTO),例如ResponseEntityResponseBody等,这些对象可以方便地构建和返回RESTful API的响应。

此外,在Spring Boot框架中,传输对象模式也得到了广泛应用。Spring Boot提供了自动配置和简化开发的特性,使得使用传输对象模式更加方便。通过使用传输对象,可以轻松地将多个相关的属性封装到一个对象中,并使用Spring Boot提供的自动配置功能进行数据的序列化和反序列化。

传输对象模式在Spring框架中得到了广泛的应用,它简化了数据的处理和传输过程,提高了应用程序的开发效率和可维护性。

在这里插入图片描述

设计模式-规格模式

设计模式-调停者模式

设计模式-门面模式

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

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

相关文章

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺,4*A53架构,Android 9.0操作系统,搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力,专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…

MySQL进阶篇(五) 锁

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…

深入浅出Android dmabuf_dump工具

目录 dmabuf是什么? dmabuf_dump工具介绍(基于Android 14) Android.bp dmabuf_dump.cpp 整体架构结构如下 dmabuf_dump主要包含以下功能 前置背景知识 fdinfo 思考 bufinfo Dump整个手机系统的dmabuf Dump某个进程的dmabuf​​​​​​​ 以Table[buff…

【JVM 基础】类字节码详解

JVM 基础 - 类字节码详解 多语言编译为字节码在JVM运行Java字节码文件Class文件的结构属性从一个例子开始反编译字节码文件字节码文件信息常量池方法表集合类名 再看两个示例分析try-catch-finallykotlin 函数扩展的实现 源代码通过编译器编译为字节码,再通过类加载…

文件指针 FILE结构体

C语言中的文件指针是指向FILE类型结构体的指针。(也就是说 文件指针的类型就是FILE类型) 在C语言中,使用文件指针来操作文件。FILE类型是一个结构体类型,它包含了与文件相关的信息,例如文件位置指示器、文件读写状态等。通过文件指针&#x…

【MySQL】多表查询

文章目录 多表查询是什么?一、笛卡尔积(或交叉连接)二、多表查询分类分类1:等值连接 vs 非等值连接等值连接非等值连接 分类2:自连接 vs 非自连接分类2:内连接 vs 外连接 三、SQL99SQL99 实现 内连接SQL99 …

深度解析Pytest插件pytest-html

在软件开发中,测试报告是开发者获取测试结果和问题定位的关键工具之一。然而,标准的控制台输出有时难以满足我们对测试报告的需求。幸运的是,Pytest插件 pytest-html 提供了一种简单而强大的方式,可以生成漂亮、可视化的HTML格式测…

1992年-2020年ESA_CCI土地覆盖数据介绍、下载与数据分享

数据介绍 ESA CCI Land Cover是欧洲空间局(European Space Agency,ESA)的一个项目,其目标是生成全球土地覆盖的高质量、一致性和长期的时间序列数据,分辨率大约为300米。 该项目是ESA气候变化计划(Climate…

AI大模型学习笔记二

文章目录 一、Prompt Engineering1)环境准备 二、LangChain(一个框架名字)三、Fine-tuning(微调) 一、Prompt Engineering 1)环境准备 ①安装OpenAI库 pip install --upgrade openai附加 安装来源 pyth…

阶段十-分布式锁

5.1 节 为什么要使用分布式锁 锁是多线程代码中的概念,只有当多任务访问同一个互斥的共享资源时才需要。如下图: 在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者lock的方式来解决多线程间的代码同步问…

远程登陆利器 ssh

文章目录 远程登陆利器 ssh登陆远程服务器指定用户名多数情况的登陆方式查看服务器的时间指定端口更多信息 远程登陆利器 ssh ssh命令是openssh套件中的客户端连接工具,使用加密协议实现安全的远程登录服务器,实现对服务器的远程管理。 官方定义为&…

ZZULIOJ 1110: 最近共同祖先(函数专题)

题目描述 如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结 点(编号是1 的结点)都有一条唯一的路径,比如从10 到根结点的路径是(10, 5, 2, 1), 从4 到根结点的路径是(4, 2, 1)&#xff0…

网络地图服务(WMS)详解

文章目录 1.概述2.GetCapabilities3.GetMap4.GetFeatureInfo 阅读本文之前可参考前文:《地图服务器GeoServer的安装与配置》与《GeoServer发布地图服务(WMS、WFS)》。 1.概述 经过前文的介绍,相信我们对WMS/WFS服务已经有了一个非…

Modbus协议学习第二篇之Modbus poll slave仿真软件初体验

软件准备 学习Modbus离不开硬件,好在我们可以通过仿真软件来模拟硬件,本篇博客就来简单介绍一下Modbus仿真软件的最基础使用方法,需要用到的3款仿真软件如下: Modbus Poll 64位 / Modbus Poll 32位(根据自己机器位数选…

C++——map和set的基本使用

目录 一,关联式容器 二,键值对 三,set的使用 3.1 set介绍 3.2 set的插入和删除 3.3 set的pair 3.4 multiset 四,map的使用 4.1 map介绍 4.2 map实现简易字典 4.3 map实现统计次数 4.4 map的[] 五,使用map或…

LV.13 D11 Linux驱动移植及内核深化 学习笔记

一、设备树 1.1 设备树 设备树是一种描述硬件信息的数据结构,Linux内核运行时可以通过设备树将硬件信息直接传递给Linux内核,而不再需要在Linux内核中包含大量的冗余编码 举例:让LED2闪烁的代码中,有逻辑代码和设备代码。Li…

案例121:基于微信小程序的作品集展示系统设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

【模型评估 04】A/B测试的陷阱

互联网公司中,A/B测试是验证新模块、新功能、新产品是否有效;新算法、新模型的效果是否有提升;新设计是否受到用户欢迎;新更改是否影响用户体验的主要测试方法。在机器学习领域中,A/B测试是验证模型最终效果的主要手段…

C语言 - 最简单,最易懂的指针、引用讲解

一、变量、地址、变量值 二、直接上代码&#xff0c;一边看上图&#xff0c;一边讲解 #include <stdio.h>struct Hello {int a;int b; };int main() {struct Hello h;h.a 10;h.b 20;struct Hello *hp;hp &h;printf("1: h的地址是%d&#xff0c;hp地址是%d \…

stm32学习笔记:USART串口通信

1、串口通信协议&#xff08;简介软硬件规则&#xff09; 全双工&#xff1a;打电话。半双工&#xff1a;对讲机。单工&#xff1a;广播 时钟&#xff1a;I2C和SPI有单独的时钟线&#xff0c;所以它们是同步的&#xff0c;接收方可以在时钟信号的指引下进行采样。串口、CAN和…