Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解
前言
在這篇文章中,我們將討論 Java / J2EE項(xiàng)目中最常用的 Converter Design Pattern。由于Java8 功能不僅提供了相應(yīng)類(lèi)型之間的通用雙向轉(zhuǎn)換方式,而且還提供了轉(zhuǎn)換相同類(lèi)型對(duì)象集合的常用方法,從而將樣板代碼減少到絕對(duì)最小值。我們使用Java8 功能編寫(xiě)了此模式的源代碼。
目的
轉(zhuǎn)換器設(shè)計(jì)模式的目的是為相應(yīng)類(lèi)型之間的雙向轉(zhuǎn)換提供一種通用的方式,允許類(lèi)型無(wú)需彼此了解的簡(jiǎn)潔的實(shí)現(xiàn)。此外,轉(zhuǎn)換器設(shè)計(jì)模式引入了雙向收集映射,將樣板代碼減少到最小。
源代碼
轉(zhuǎn)換器設(shè)計(jì)模式是一種行為設(shè)計(jì)模式,允許在相應(yīng)類(lèi)型(如DTO和邏輯同構(gòu)類(lèi)型的域表示)之間進(jìn)行雙向轉(zhuǎn)換。此外,該模式還引入了一種在類(lèi)型之間轉(zhuǎn)換對(duì)象集合的通用方法。
類(lèi)圖
讓我們根據(jù)上面的類(lèi)圖編寫(xiě)源代碼。
在本例中,我們將把customerd轉(zhuǎn)換為customer實(shí)體,反之亦然,我們還將在類(lèi)型之間轉(zhuǎn)換對(duì)象集合。
步驟1:讓我們創(chuàng)建一個(gè)通用轉(zhuǎn)換器。
public abstract class Converter < T, C > { private final Function < T, C > fromDto; private final Function < C, T > fromEntity; /** * @param fromDto * Function that converts given dto entity into the domain * entity. * @param fromEntity * Function that converts given domain entity into the dto * entity. */ public Converter(final Function < T, C > fromDto, final Function < C, T > fromEntity) { this.fromDto = fromDto; this.fromEntity = fromEntity; } /** * @param customerDto * DTO entity * @return The domain representation - the result of the converting function * application on dto entity. */ public final C convertFromDto(final T customerDto) { return fromDto.apply(customerDto); } /** * @param customer * domain entity * @return The DTO representation - the result of the converting function * application on domain entity. */ public final T convertFromEntity(final C customer) { return fromEntity.apply(customer); } /** * @param dtoCustomers * collection of DTO entities * @return List of domain representation of provided entities retrieved by * mapping each of them with the conversion function */ public final List < C > createFromDtos(final Collection < T > dtoCustomers) { return dtoCustomers.stream().map(this::convertFromDto).collect(Collectors.toList()); } /** * @param customers * collection of domain entities * @return List of domain representation of provided entities retrieved by * mapping each of them with the conversion function */ public final List < T > createFromEntities(final Collection < C > customers) { return customers.stream().map(this::convertFromEntity).collect(Collectors.toList()); } }
步驟2:讓我們創(chuàng)建一個(gè)簡(jiǎn)單客戶轉(zhuǎn)換器的實(shí)現(xiàn)。
public class CustomerConverter extends Converter<CustomerDto, Customer> { public CustomerConverter() { super(customerDto -> new Customer(customerDto.getCustomerId(), customerDto.getCustomerName(), customerDto.getCustomerLastName(), customerDto.isStatus()), customer -> new CustomerDto(customer.getCustomerId(), customer.getCustomerName(), customer.getCustomerLastName(), customer.isStatus())); } }
步驟3: 創(chuàng)建customerdto類(lèi)。
public class CustomerDto { private String customerId; private String customerName; private String customerLastName; private boolean status; public CustomerDto(String customerId, String customerName, String customerLastName, boolean status) { super(); this.customerId = customerId; this.customerName = customerName; this.customerLastName = customerLastName; this.status = status; } public String getCustomerId() { return customerId; } public void setCustomerId(String customerId) { this.customerId = customerId; } public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public String getCustomerLastName() { return customerLastName; } public void setCustomerLastName(String customerLastName) { this.customerLastName = customerLastName; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } }
步驟4: 創(chuàng)建Customer實(shí)體類(lèi)。
public class Customer { private String customerId; private String customerName; private String customerLastName; private boolean status; public Customer(String customerId, String customerName, String customerLastName, boolean status) { super(); this.customerId = customerId; this.customerName = customerName; this.customerLastName = customerLastName; this.status = status; } public String getCustomerId() { return customerId; } public void setCustomerId(String customerId) { this.customerId = customerId; } public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public String getCustomerLastName() { return customerLastName; } public void setCustomerLastName(String customerLastName) { this.customerLastName = customerLastName; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } }
步驟5: 現(xiàn)在,讓我們通過(guò)創(chuàng)建Client類(lèi)來(lái)測(cè)試這個(gè)模式。
public class Client { /** * Program entry point * * @param args command line args */ public static void main(String[] args) { Converter < CustomerDto, Customer > CustomerConverter = new CustomerConverter(); CustomerDto dtoCustomer = new CustomerDto("100", "Ramesh", "Fadatare", true); Customer Customer = CustomerConverter.convertFromDto(dtoCustomer); System.out.println("Entity converted from DTO:" + Customer); List < Customer > customers = new ArrayList < > (); customers.add(new Customer("100", "Ramesh1", "Fadatare", true)); customers.add(new Customer("200", "Ramesh2", "Fadatare", true)); customers.add(new Customer("300", "Ramesh3", "Fadatare", true)); customers.forEach(System.out::println); customers.forEach((customer) - > System.out.println(customer.getCustomerId())); System.out.println("DTO entities converted from domain:"); List < CustomerDto > dtoEntities = CustomerConverter.createFromEntities(customers); dtoEntities.forEach(System.out::println); dtoEntities.forEach((customer) - > System.out.println(customer.getCustomerId())); } }
輸出:
Entity converted from DTO:com.ramesh.j2ee.converter.Customer@87aac27
com.ramesh.j2ee.converter.Customer@1b28cdfa
com.ramesh.j2ee.converter.Customer@eed1f14
com.ramesh.j2ee.converter.Customer@7229724f
100
200
300
DTO entities converted from domain:
com.ramesh.j2ee.converter.CustomerDto@4dd8dc3
com.ramesh.j2ee.converter.CustomerDto@6d03e736
com.ramesh.j2ee.converter.CustomerDto@568db2f2
100
200
300
適用性
在以下情況下 使用轉(zhuǎn)換器模式:
- 當(dāng)您擁有邏輯上與其他類(lèi)型相對(duì)應(yīng)的類(lèi)型時(shí),您需要在它們之間轉(zhuǎn)換實(shí)體
- 如果要根據(jù)上下文提供不同類(lèi)型的轉(zhuǎn)換方式
- 每當(dāng)您引入DTO(數(shù)據(jù)傳輸對(duì)象)時(shí),您可能需要將其轉(zhuǎn)換為域等效。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
淺析RxJava處理復(fù)雜表單驗(yàn)證問(wèn)題的方法
這篇文章主要介紹了RxJava處理復(fù)雜表單驗(yàn)證問(wèn)題的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Java中final關(guān)鍵字和final的四種用法實(shí)例
final關(guān)鍵字代表最終的、不可改變的,下面這篇文章主要給大家介紹了關(guān)于Java中final關(guān)鍵字和final的四種用法實(shí)例,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02在idea中將創(chuàng)建的java web項(xiàng)目部署到Tomcat中的過(guò)程圖文詳解
這篇文章主要介紹了在idea中將創(chuàng)建的java web項(xiàng)目部署到Tomcat中的過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04