设计模式-传输对象模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 传输对象模式和序列化的区别
    • 代码示例
      • 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 age
    public 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 = name
        self.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.mfbz.cn/a/320788.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【redis基础1】基础数据类型详解和应用案例

博客计划 ,我们从redis开始,主要是因为这一块内容的重要性不亚于数据库,但是很多人往往对redis的问题感到陌生,所以我们先来研究一下。 本篇,我们先看一下redis的基础数据类型详解和应用案例。 1.redis概述 以mysql为…

某mps政务网站jsl加速乐cookie逆向解析

本文针对的目标网站如下,使用base64解密获得 aHR0cHM6Ly93d3cubXBzLmdvdi5jbi8 开篇:加速乐其实算是比较好处理的逆向问题了,了解过的朋友都知道,其本身跟瑞数相似,都是设置cookie后才能成功,设置cookie的过…

配置CentOS系统以支持静态HTTP服务

CentOS是一个流行的Linux发行版,广泛应用于服务器环境。要配置CentOS系统以支持静态HTTP服务,您可以按照以下步骤进行操作: 安装Web服务器软件:CentOS自带了Apache HTTP服务器软件,您可以使用以下命令安装它&#xff1…

计算机找不到vcomp140.dll怎样修复?马上教会你修复dll问题

在计算机系统运行过程中,遭遇“vcomp140.dll丢失”的场景并不少见,这一问题的出现往往伴随着软件无法正常启动、运行时错误提示或者系统性能下降等现象。具体场景可能包括但不限于:用户在尝试打开某个依赖于Visual C Redistributable库的应用…

机器学习入门知识

一、引言 机器学习是当前信息技术中最令人振奋的领域之一。在这门课程中,我们将探索该技术的前沿,并能够亲自实现机器学习的算法。 或许你每天都在不知不觉中使用了机器学习的算法。每次你打开谷歌或必应搜索你需要的内容,正是因为它们拥有出…

FFmpeg技术详解

FFmpeg技术详解 本文概不介绍相关安装配置,详情请入官方或者其他大佬博客,此处做出推荐: https://ffmpeg.org/ FFmpeg官网 https://ffmpeg.github.net.cn/developer.html FFmpeg中文文档 https://blog.csdn.net/m0_47449768/article/details/…

以太网抓包软件Wireshake应用介绍( SMART PLC MODBUSTCP通信)

首先介绍下常看到的字符ACK,ACK是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符,表示发来的数据已确认接收无误。在TCP/IP协议中,如果接收方成功的接收到数据,会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。ACK在TCP的…

Github Copilot最全的安装与使用教程:一款非常好用的AI编程工具

Github Copilot最全的安装与使用教程 第一章 安装1.安装 GitHub Copilot2.获取资格第二章 使用1.产生建议1.1 键入你想要完成的操作的注释1.2 CtrlI 2. 接受建议3.查看下一个建议3.接受部分建议4.在新选项卡接受建议5.完成多项功能6.聊天 GitHub Copilot 供经过验证的学生、教师…

AI绘画风格化实战

在社交软件和短视频平台上,我们时常能看到各种特色鲜明的视觉效果,比如卡通化的图片和中国风的视频剪辑。这些有趣的风格化效果其实都是图像风格化技术的应用成果。 风格化效果举例 MidLibrary 这个网站提供了不同的图像风格,每一种都带有鲜…

【前端性能优化】如何取消http请求

文章目录 需要取消http请求的3种经典场景原生XMLHttpRequest取消http请求fetch取消http请求axios取消http请求哪些情况需要取消HTTP请求取消http请求能带来哪些性能提升 需要取消http请求的3种经典场景 场景一:有一个实时搜索功能,每当用户输入内容改变的…

构建中国人自己的私人GPT-有道GPT

创作不易,请大家多鼓励支持。 在现实生活中,很多人的资料是不愿意公布在互联网上的,但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢?于是我们构建自己或公司的私人GPT变得非常重要。 先看效果 一、…

训练AI模型:寻找最优参数a和b

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

基于面向对象,C++实现双链表

双链表同单链表类似,由一个值和两个指针组成 Node.h节点头文件 #pragma once class Node { public:int value;Node* prev;Node* next;Node(int value);~Node(); };Node.cpp节点源文件 #include "Node.h"Node::Node(int value) {this->value value…

深度学习笔记(六)——网络优化(2):参数更新优化器SGD、SGDM、AdaGrad、RMSProp、Adam

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 在前面的博文中已经学习了构建神经网络的基础需求,搭建了一个简单的双层网络结构来实现数据的分…

【设计模式】什么场景可以考虑使用简单工厂模式

1.概述 工厂模式是一种创建型模式,主要作用就是创建对象,将对象的创建过程和使用的过程进行解耦。我们平时说的工厂模式实际上是对三种不同类型的工厂模式的统称,简单工厂、工厂方法、抽象工厂,而在23种设计模式中,只…

VSCode编写 C/C++ 程序

VSCode 全称 Visual Studio Code,是微软出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,并…

SG-8101CGA 系列 (晶体振荡器 可编程 可用 +125°C )

SG-8101CGA是可编程晶体振荡器,具有CMOS输出,适用于汽车,同时,该系列还提供相同的频率和其他参数的轻松编程能力,符合AEC-Q100标准,具有出色的电磁兼容性和稳定性,可以在各种环境下使用。外部尺…

Linux下编写zlg7290驱动(1)

大家好,今天给大家介绍Linux下编写zlg7290驱动(1),文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 在智能仪表中,经常会用到键盘、数码管等外设。因此&…

Windows Server 2012 R2部署项目

JDK 下载JDK 1.直接官网下载:http://www.oracle.com/; 2.我用的是1.8,阿里云盘分享地址:https://www.aliyundrive.com/s/u4V9x1AHL2r 安装jdk 双击安装点击下一步如果不改变路径就一直下一步 安装完成直接点击关闭即可&#x…

高光谱分类论文解读分享之基于形态卷积神经网络的高光谱影像分类

IEEE TGRS 2021:基于形态卷积神经网络的高光谱影像分类 题目 Morphological Convolutional Neural Networks for Hyperspectral Image Classification 作者 Swalpa Kumar Roy; Ranjan Mondal; Mercedes E. Paoletti; Juan M. Haut; Antonio Plaza 关键词 Clas…