[Design Patterns] Transfer Object

Transfer Object (đối tượng chuyển nhượng) được sử dụng khi chúng ta muốn truyền dữ liệu với nhiều thuộc tính từ client tới server. Transfer Object còn được biết đến với một cái tên khác là Value Object (đối tượng lưu trữ các giá trị). Transfer Object là một class POJO đơn giản với các

Transfer Object (đối tượng chuyển nhượng) được sử dụng khi chúng ta muốn truyền dữ liệu với nhiều thuộc tính từ client tới server. Transfer Object còn được biết đến với một cái tên khác là Value Object (đối tượng lưu trữ các giá trị). Transfer Object là một class POJO đơn giản với các phương thức getter/setter và có thể được chuẩn hóa để truyền qua mạng kết nối. Các object này không có chứa bất kỳ phương thức nào khác. Các class xử lý logic ở server thường truy vấn dữ liệu từ database và tạo ra các POJO để chuyển tới client. Đối với client thì các Transfer Object là các object read-only không thể được ghi đè dữ liệu đang chứa. Code client có thể tự tạo ra các Transfer Object và truyền tới server để cập nhật dữ liệu trong database. Sau đây là các thành phần của pattern:

  • Transfer Object – POJO đơn giản với các phương thức getter/setter.
  • Business Object – đối tượng xử lý logic của server sẽ tạo ra các Transfer Object và chuyển cho client.
  • Client – object gửi yêu cầu và chuyển các Transfer Object tới Business Object.

Áp dụng triển khai

server

  • Chúng ta sẽ tạo một class BusinessObject để đóng vai trò mô phỏng xử lý yêu cầu ở server.
  • Một interface StudentS cho Transfer Object tạo ra bởi server chuyển cho `client.
  • Một class triển khai StudentS.

client

  • Một class Client đóng vai trò mô phỏng tương tác người dùng gửi yêu cầu tới server
  • Một interface StudentC cho Transfer Object tạo ra bởi server chuyển cho `client.
  • Một class triển khai StudentC.

Bước 1

Tạo 2 interface StudentSStudentC.

server/StudentS.java

packageserver;publicinterfaceStudentS{intgetRoll();StringgetName();}

client/StudentC.java

packageclient;publicinterfaceStudentC{intgetRoll();StringgetName();}

Bước 2

Tạo 2 class Transfer Object triển khai StudentSStudentC.

server/Student.java

packageserver;classStudentimplementsStudentS{privateint roll;privateString name;Student(int roll,String name
   ){this.roll = roll;this.name = name;}@OverridepublicintgetRoll(){return roll;}@OverridepublicStringgetName(){return name;}}// class

client/Student.java

packageclient;classStudentimplementsStudentC{privateint roll;privateString name;publicStudent(int roll,String name
   ){this.roll = roll;this.name = name;}@OverridepublicintgetRoll(){return roll;}@OverridepublicStringgetName(){return name;}}// class

Bước 3

Tạo class BusinessObject.

server/BusinessObject.java

packageserver;importclient.StudentC;importjava.util.ArrayList;importjava.util.List;publicclassBusinessObject{privateList<StudentS> database;publicBusinessObject(){connectDatabase();}publicstaticStudentScloneStudent(StudentS stds){returnnewStudent(stds.getRoll(), stds.getName());}privatevoidconnectDatabase(){
      database =newArrayList<StudentS>();StudentS john =newStudent(0,"John");
      database.add(john);StudentS micheal =newStudent(1,"Micheal");
      database.add(micheal);}publicList<StudentS>getAllStudents(){return database
         .stream().map((stds)->BusinessObject.cloneStudent(stds)).toList();}publicStudentSgetStudent(int roll){return database.get(roll);}publicvoidupdateStudent(StudentC stdc){StudentS updated =newStudent(stdc.getRoll(), stdc.getName());
      database.remove(stdc.getRoll());
      database.add(updated);System.out.println("Student [ Roll : "+ updated.getRoll()+" ] "+"updated in database");}}// class

Bước 4

Tạo class Client mô tả các yêu cầu.

client/Client.java

packageclient;importserver.BusinessObject;importserver.StudentS;importjava.util.List;publicclassClient{privateBusinessObject service;publicvoidsetService(BusinessObject business){this.service = business;}publicvoidmockupRequest(){requestAndPrintAllStudents();requestAndUpdateFirstStudent();requestAndPrintAllStudents();}privatevoidrequestAndPrintAllStudents(){System.out.println("=== Request & Print All Students");List<StudentS> studentList = service.getAllStudents();
      studentList.forEach((std)->printStudentInfo(std.getRoll(), std.getName()));}privatevoidrequestAndUpdateFirstStudent(){System.out.println("=== Request & Update First Student");StudentS firstStd = service.getStudent(0);StudentC updated =newStudent(firstStd.getRoll(),"Kei");
      service.updateStudent(updated);}privatevoidprintStudentInfo(int roll,String name){System.out.println("Student [ Roll : "+ roll +", Name : "+ name +" ]");}}

Bước 5

Chạy thử hoạt động của pattern.

PatternDemo.java

importclient.Client;importserver.BusinessObject;publicclassPatternDemo{publicstaticvoidmain(String[] args){BusinessObject business =newBusinessObject();Client client =newClient();
      client.setService(business);
      client.mockupRequest();}}// class

Bước 6

Kiểm chứng lại kết quả được in ra tại console.

console

===Request&PrintAllStudentsStudent[Roll:0,Name:John]Student[Roll:1,Name:Micheal]===Request&UpdateFirstStudentStudent[Roll:0] updated in database
===Request&PrintAllStudentsStudent[Roll:1,Name:Micheal]Student[Roll:0,Name:Kei]

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ