【设计模式】JAVA Design Patterns——Converter(转换器模式)

🔍目的


转换器模式的目的是提供相应类型之间双向转换的通用方法,允许进行干净的实现,而类型之间无需相互了解。此外,Converter模式引入了双向集合映射,从而将样板代码减少到最少

🔍解释


真实世界例子

在真实的应用中经常有这种情况,数据库层包含需要被转换成业务逻辑层DTO来使用的实体。对于潜在的大量类进行类似的映射,我们需要一种通用的方法来实现这一点。

通俗描述

转换器模式让一个类的实例映射成另一个类的实例变得简单

程序示例

需要一个通用的方案来解决映射问题,就需要创建一个通用的转换器:

public class Converter<T, U> {

  private final Function<T, U> fromDto;
  private final Function<U, T> fromEntity;

  public Converter(final Function<T, U> fromDto, final Function<U, T> fromEntity) {
    this.fromDto = fromDto;
    this.fromEntity = fromEntity;
  }

  public final U convertFromDto(final T dto) {
    return fromDto.apply(dto);
  }

  public final T convertFromEntity(final U entity) {
    return fromEntity.apply(entity);
  }

  public final List<U> createFromDtos(final Collection<T> dtos) {
    return dtos.stream().map(this::convertFromDto).collect(Collectors.toList());
  }

  public final List<T> createFromEntities(final Collection<U> entities) {
    return entities.stream().map(this::convertFromEntity).collect(Collectors.toList());
  }
}

创建一个专属的转换器继承上面的基类:

public class UserConverter extends Converter<UserDto, User> {

  public UserConverter() {
    super(UserConverter::convertToEntity, UserConverter::convertToDto);
  }

  private static UserDto convertToDto(User user) {
    return new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), user.getUserId());
  }

  private static User convertToEntity(UserDto dto) {
    return new User(dto.getFirstName(), dto.getLastName(), dto.isActive(), dto.getEmail());
  }

}

现在就可以做到User和UserDto之间的映射编简单

var userConverter = new UserConverter();
var dtoUser = new UserDto("John", "Doe", true, "whatever[at]wherever.com");
var user = userConverter.convertFromDto(dtoUser);

🔍类图


🔍适用场景


在下面这些情况下使用转换器模式:

  • 如果你的类型在逻辑上相互对应,并需要在它们之间转换实体
  • 当你想根据上下文提供不同的类型转换方式时
  • 每当你引入DTO(数据传输对象)时你可能都需要将其转换为
    DO

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

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

相关文章

图论-最短路算法

1. Floyd算法 作用&#xff1a;用于求解多源最短路&#xff0c;可以求解出任意两点的最短路 利用动态规划只需三重循环即可&#xff08;动态规划可以把问题求解分为多个阶段&#xff09;定义dp[k][i][j]表示点i到点j的路径&#xff08;除去起点终点&#xff09;中最大编号不超…

差距从10%缩小至3%,这两个关键岗位决定数字化进程

ITValue 数字化这件事情&#xff0c;2024战火重燃&#xff0c;《数字化转型新思》报告调研启动。 作者&#xff5c;杨丽 首发&#xff5c;钛媒体APP ITValue “数字化”已经不是新词&#xff0c;但这不代表数字化转型已经成熟落地。甚至相反&#xff0c;站在“数字化”的供需两…

Discourse 设置 passkey 登录

苹果在2022年的WWDC大会上宣布了在iOS设备上可以使用一种名叫Passkey的无密码登录&#xff0c;苹果把它翻译成“通行密钥”&#xff0c;并随后又在macOS上支持它。 谷歌和微软随后也宣布在Android和Windows系统上支持通行密钥。 密码登录&#xff0c;要求用户设置一个高强度的…

C#解析JSON的常用库--Newtonsoft.Json

一、库介绍 在C#中&#xff0c;解析JSON的常用库有Newtonsoft.Json&#xff08;也称为Json.NET&#xff09;和 System.Text.Json&#xff08;从 .NET Core 3.0 开始引入&#xff09;。本文主要介绍 Newtonsoft.Json。 二、下载 官网&#xff1a; https://www.nuget.org/pack…

m3u8下载插件,视频下载插件,抓取网页视频插件,Video DownloadHelper

可以直接在网页中&#xff0c;下载视频的浏览器插件 “Video DownloadHelper” 我用的是火狐浏览器&#xff0c;下面以火狐浏览器举例&#xff0c;Google浏览器大致相同 1、在浏览器中输入网址这个网址 about:addons&#xff0c;并且在下面输入框中&#xff0c;输入“Video Dow…

SVG批量转为pdf超有效的方式!

最近在整理工作&#xff0c;发现ppt里面画的图智能导出svg格式无法导出pdf格式&#xff0c;由于在线的网站会把我的图片搞乱而且不想下载visio&#xff08;会把本地的word搞坏&#xff09;&#xff0c;因此琢磨出这种批量转换的方式。 1. 下载并安装Inkscape 下载链接&#xf…

基于云开发快速搭建智能名片小程序

熏风徐来&#xff0c;麦穗摇曳&#xff1b;麦类等夏熟作物生长旺盛&#xff0c;籽粒灌浆渐趋饱满&#xff0c;但尚未完全成熟&#xff0c;故称“小满”。 今日小满&#xff0c;基于云开发快速搭建智能名片小程序&#xff0c;发文以记录输入和输出过程。 一、功能总览&#xff…

基于SSM的“医院门诊管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“医院门诊管理系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能模块图 医院门诊管理系统首页页面图 用户登录界面图 管…

深度神经网络——什么是 K 均值聚类?

K 均值聚类 K 均值聚类是 无监督学习在所有无监督学习算法中&#xff0c;K 均值聚类可能是使用最广泛的&#xff0c;这要归功于它的强大功能和简单性。 K-means 聚类到底是如何工作的&#xff1f; 简而言之&#xff0c;K 均值聚类的工作原理是 创建参考点&#xff08;质心&am…

CSRF 攻击

概述 CSRF(Cross-site request forgery,跨站请求伪造)。 它是指攻击者利用了用户的身份信息&#xff0c;执行了用户非本意的操作。 它首先引导用户访问一个危险网站&#xff0c;当用户访问网站后&#xff0c;网站会发送请求到被攻击的站点&#xff0c;这次请求会携带用户的c…

【北京市政府网_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Vue3+Vite解决跨域问题

Vue3项目 首先找到项目里面的vite.cofig.js找到代码中的server然后替换成下面的即可 server: { //主要是加上这段代码//hostport实际上就是项目的启动地址是多少host: 127.0.0.1,port: 8001,proxy: {/api: {//这里的target实际上就是真实的后端地址&#xff0c;看看你的路径前缀…

Google Play开发者账号被封关联风险分析以及提高上包成功率方法

一&#xff1a;谷歌通过多种方法判断应用是否为马甲包或存在关联&#xff0c;但具体算法和方法并没有对外公开&#xff0c;以下是一些可能属性&#xff1a; 1、开发者账号资料 开发者的身份&#xff0c;付款银行卡,绑定的手机号,辅助邮箱等&#xff0c;其中收款账户还是在其中…

记录github小程序短视频系统的搭建过程

GitHub - lkmc2/AwesomeVideoWxApp: 《倾心短视频》微信小程序 这个项目按readme中的来可以部署成功&#xff0c;但是会发现图片、视频全是空的&#xff0c;如下图&#xff1a; 修改源代码&#xff0c;更换图片上传与保存地址 大概涉及到这些代码块&#xff0c;进行更改即可。…

Ubuntu 20.04中用scrapy爬取博客园新闻首页的简单示例

一、梳理scrapy项目目录创建&#xff1a; 1、命令行终端定位到pycharm主目录&#xff1a;cd PycharmProjects 2、建立项目名称&#xff1a;scrapy startproject searchArticle 3、定位到项目目录下&#xff1a;cd searchArticle 4、设置爬虫名称与欲爬取的域名地址&#xf…

Python使用连接池操作MySQL

测试环境说明&#xff1a;Python版本是 3.8.10 &#xff0c;DBUtils版本是3.1.0 &#xff0c;pymysql版本是1.0.3 首先安装指定版本的连接池库DBUtils 、还有pymysql pip install DBUtils3.1.0 pip install pymysql1.0.3创建文件 sqlConfig.py # sqlConfig.pyimport pymysql…

FL Studio21中文版新特性!揭秘中文水果编曲神器

FL Studio 21&#xff0c;被广大音乐创作者昵称为“水果编曲软件”&#xff0c;是比利时的Image-Line公司研发的一款完整的音乐制作环境或数字音频工作站&#xff08;DAW&#xff09;。自从1997年首次推出以来&#xff0c;FL Studio一直是许多音乐制作人和爱好者的首选&#xf…

基于 Java 的浏览器——JxBrowser使用分享

软件介绍 JxBrowser 是一个基于 Java 的浏览器&#xff0c;它使用 Chromium 引擎来提供高性能的网页渲染和丰富的功能。它支持多种 GUI 框架&#xff0c;如 Swing、JavaFX 和 SWT&#xff0c;使得在 Java 应用程序中嵌入浏览器组件变得简单。 JxBrowser 是一个适用于多种用途…

Docker技术搭建Grafana监控平台

centos7虚拟机和docker的安装&#xff1a;可以参考之前的博文 CPU、mysql-exporter、docker监控模板&#xff1a;百度网盘 提取码&#xff1a;0000 先查看服务器时间是否和当前时间一致&#xff0c;如果不一致&#xff0c;查看对应设置&#xff1a;centos7时间同步博文 一、…