GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Design pattern Hướng dẫn Java Design Pattern – Transfer Object

Hướng dẫn Java Design Pattern – Transfer Object

Đăng vào 22/02/2019 . Được đăng bởi GP Coder . 20712 Lượt xem . Toàn màn hình

Nội dung

  • 1 Transfer Object Pattern là gì?
  • 2 Cài đặt Transfer Object Pattern như thế nào?
  • 3 Lợi ích của Transfer Object Pattern là gì?

Transfer Object Pattern là gì?

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO).

Transfer Object đơn giản là một POJO (Plain Old Java Object), chỉ chứa các getter/ setter method và có thể có implement serialize để truyền tải dữ liệu thông qua network.

DTO hoàn toàn không chứa behavior/ logic, chỉ được sử dụng để truyền dữ liệu và map dữ liệu từ các Domain Model trước khi truyền tới Client. Trong các ứng dụng đơn giản, các Domain Model thường có thể được sử dụng lại trực tiếp dưới dạng DTO và được truyền trực tiếp đến lớp hiển thị, do đó chỉ có một Data Model thống nhất. Đối với các ứng dụng phức tạp hơn, chúng ta không muốn hiển thị toàn bộ Domain Model cho Client, do đó, việc ánh xạ từ các Domain Model sang DTO là cần thiết.

Cài đặt Transfer Object Pattern như thế nào?

Các thành phần tham gia Transfer Object Pattern:

  • Business Object : là một Business Service, tạo Transfer Object và trả nó về Client khi cần thiết. Nó cũng có thể nhận dữ liệu từ Client trong một Transfer Object và gửi đến Server để cập nhật vào database.
  • Transfer Object : là một POJO, chỉ chứa các getter/ setter method.
  • Client : người sử dụng ứng dụng.

Ví dụ sử dụng Transfer Object Pattern

Lớp xử lý nghiệp vụ ở phía Server thường truy vấn dữ liệu từ database và gán các giá trị vào Transfer Object để gửi lại Client. Phía Client có thể tạo một Transfer Object và gán giá trị vào để gửi lại Server thực hiện update vào database.

Trong ví dụ bên dưới, chúng ta sẽ cùng tìm hiểu cách áp dụng DTO với DAO ở bài viết trước.

UserModel.java


package com.gpcoder.patterns.other.dto;

import lombok.Data;

/**
 * Domain Model / Entity
 */
@Data
public class UserModel {

	private Integer id;
	private String userName;
	private String fullName;
	private String password;
	private String email;
	private String bankAccount;
}

Dao.java


package com.gpcoder.patterns.other.dto;

import java.util.List;
import java.util.Optional;

/**
 * Data Access Object
 */
public interface Dao<T> {

	List<T> getAll();

	Optional<T> get(Integer id);

	void save(T t);

	void update(T t);

	void delete(T t);
}

UserDao.java


package com.gpcoder.patterns.other.dto;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class UserDao implements Dao<UserModel> {

	// Temporary database
	private List<UserModel> users = new ArrayList<>();

	public UserDao() {
		UserModel user = new UserModel();
		user.setId(1);
		user.setUserName("gpcoder");
		user.setEmail("gpcodervn@gmail.com");
		user.setFullName("GP Coder");
		user.setPassword("1234567");
		user.setBankAccount("9999-9999-9999");
		users.add(user);
	}

	@Override
	public List<UserModel> getAll() {
		return users;
	}

	@Override
	public Optional<UserModel> get(Integer id) {
		return users.stream().filter(u -> u.getId() == id).findFirst();
	}

	@Override
	public void save(UserModel user) {
		users.add(user);
	}

	@Override
	public void update(UserModel user) {
		int index = -1;
		for (UserModel u : users) {
			index++;
			if (user.getId().equals(u.getId())) {
				users.set(index, user);
				break;
			}
		}
	}

	@Override
	public void delete(UserModel user) {
		get(user.getId()).ifPresent(existUser -> users.remove(existUser));
	}
}

UserDTO.java


package com.gpcoder.patterns.other.dto;

import lombok.Data;

/**
 * Data Transfer Object
 */
@Data
public class UserDTO {

	private Integer id;
	private String userName;
	private String fullName;
	private String email;
}

UserService.java


package com.gpcoder.patterns.other.dto;

/**
 * Business Object / Logic
 */
public class UserService {

	private UserDao dao = new UserDao();

	public UserDTO getUser(Integer id) {
		UserModel model = dao.get(id).get();
		return convertToDTO(model);
	}

	public void saveUser(UserDTO dto) {
		UserModel model = convertToModel(dto);
		dao.save(model);
	}

	public void updateUser(UserDTO dto) {
		UserModel model = convertToModel(dto);
		dao.update(model);
	}

	private UserModel convertToModel(UserDTO dto) {
		UserModel model = new UserModel();
		model.setId(dto.getId());
		model.setFullName(dto.getFullName());
		model.setUserName(dto.getUserName());
		model.setEmail(dto.getEmail());
		return model;
	}

	private UserDTO convertToDTO(UserModel model) {
		UserDTO dto = new UserDTO();
		dto.setId(model.getId());
		dto.setFullName(model.getFullName());
		dto.setUserName(model.getUserName());
		dto.setEmail(model.getEmail());
		return dto;
	}
}

DataAccessObjectPatternExample.java


package com.gpcoder.patterns.other.dto;

/**
 * Client - Data Access Object Pattern Example
 */
public class DataAccessObjectPatternExample {

	public static void main(String[] args) {
		UserService service = new UserService();
		UserDTO dto = service.getUser(1);
		System.out.println("User: " + dto);

		dto.setFullName("gpcoder.com");
		service.updateUser(dto);
		System.out.println("User Updated: " + dto);
	}
}

Output của chương trình:


User: UserDTO(id=1, userName=gpcoder, fullName=GP Coder, email=gpcodervn@gmail.com)
User Updated: UserDTO(id=1, userName=gpcoder, fullName=gpcoder.com, email=gpcodervn@gmail.com)

Lợi ích của Transfer Object Pattern là gì?

  • Tách biệt logic một cách rõ ràng : Transfer Object chỉ chứa data, còn logic được implement trong phần khác.
  • Cãi thiện hiệu suất ứng dụng : chi phí của mỗi request/ response là lớn, chúng ta nên cố gắng gửi nhiều nhất có thể. Để làm điều này, chúng ta có thể tạo một Transfer Object để gửi data từ Client lên Server hay từ Server đến Client một lần duy nhất, thay vì phải gửi từng phần riêng lẻ.
  • Giảm kết dính giữa các tầng trong ứng dụng: Client chỉ thao tác với Transfer Object, nên nó không bị ảnh hưởng khi Domain Model thay đổi.
  • Bao đóng các đối số : một phương thức có nhiều đối số, chúng ta có thể bao đóng chúng trong một Transfer Object. Giúp chúng ta dễ dàng mở rộng, thêm/ bớt đối số.
  • Nhận nhiều dữ liệu trả về : trong Java, một phương thức chỉ có thể trả về một giá trị, để có thể nhận được nhiều giá trị, chúng ta có thể bao đóng chúng trong một Transfer Object.
  • Tăng bảo mật ứng dụng : tùy vào người dùng khác nhau có thể xem được một số dữ liệu nhất định. Chúng ta có thể tạo nhiều Transfer Object khác nhau cho từng loại người dùng thay vì trả về một Domain Object một cách trực tiếp. Trường hợp rõ ràng nhất là User Model, domain object này chứa thông tin cả email, password, số tài khoản ngân hàng. Chúng ta có thể tạo một Transfer Object đơn giản chỉ chứa thông tin họ tên, ngày sinh. Không cần thiết phải trả tất cả dữ liệu Domain Model về Client.
  • Transfer Object thường được sử dụng với Data Access Object .

Tài liệu tham khảo:

  • https://martinfowler.com/eaaCatalog/dataTransferObject.html
  • https://www.oracle.com/technetwork/java/transferobject-139757.html
  • https://www.tutorialspoint.com/design_pattern/transfer_object_pattern.htm
  • https://www.dineshonjava.com/transfer-object/

 

4.7
16
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Design pattern Được gắn thẻ: Design pattern

Hướng dẫn Java Design Pattern – MVC
Hướng dẫn Java Design Pattern – Intercepting Filter

Có thể bạn muốn xem:

  • Hướng dẫn Java Design Pattern – DAO (17/01/2019)
  • Hướng dẫn Java Design Pattern – Bridge (22/10/2018)
  • Hướng dẫn Java Design Pattern – Null Object (13/01/2019)
  • Hướng dẫn Java Design Pattern – Builder (26/09/2018)
  • Hướng dẫn Java Design Pattern – Proxy (30/11/2018)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98056 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97695 lượt xem)
  • Giới thiệu Design Patterns (87758 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86427 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83830 lượt xem)

Nội dung bài viết

  • 1 Transfer Object Pattern là gì?
  • 2 Cài đặt Transfer Object Pattern như thế nào?
  • 3 Lợi ích của Transfer Object Pattern là gì?

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link