[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

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con

Khi nào nên dùng main, section, article, header, footer, và aside trong HTML5

HTML5 đã giới thiệu các thẻ ngữ nghĩa giúp cấu trúc nội dung web một cách có

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th