Паттерн Transfer Object

Шаблон объекта передачи используется для передачи данных с несколькими атрибутами от клиента к серверу за один раз. Объекты передачи также известны как объекты-значения. Объект передачи — это простой POJO-класс с методами getter/setter; он сериализуем, поэтому может передаваться по сети. Он не имеет никакого поведения. Бизнес-классы на стороне сервера обычно читают данные из базы данных, заполняют POJO и отправляют его клиенту или передают по значению. Для клиента объект передачи доступен только для чтения. Клиент может создать собственный объект передачи и передать его на сервер, чтобы обновить значения в базе данных за один раз. Ниже перечислены сущности этого шаблона проектирования.

  • Бизнес-объект- Бизнес-сервис, который заполняет объекты передачи данными.
  • Объект передачи- Простой POJO, имеет только методы для установки/получения свойств.
  • Клиент- Клиент может отправлять запросы или отправлять объекты передачи бизнес-объектам.

summary

назначение

Используется для упрощения передачи данных между сетевыми или прикладными уровнями. Он инкапсулирует данные, создавая класс с несколькими свойствами; эти свойства представляют данные, которые должны быть переданы.

Основная решаемая проблема

  • Решает проблемы эффективности и инкапсуляции при передаче данных между уровнями в распределённых системах, особенно в многоуровневых приложениях.

Сценарий использования

  • Когда между клиентом и сервером требуется передавать большие объёмы данных, особенно в веб-сервисах или удалённых вызовах процедур (RPC).

Подход к реализации

  • Класс объекта передачи: Определите класс, содержащий несколько атрибутов; эти атрибуты представляют данные, которые нужно передать.
  • Уровень доступа к данным: Отвечает за извлечение данных из базы данных или других источников данных и заполнение ими объектов передачи.
  • Уровень бизнес-логики: Необязательный, обрабатывает бизнес-логику, может использовать объекты передачи.
  • Уровень представления или клиент: Использует объекты передачи для отображения данных или в качестве носителя данных для пользовательского ввода.

Ключевой код

  • Класс объекта передачи: Содержит атрибуты и возможную бизнес-логику для инкапсуляции и передачи данных.

Пример приложения

  • Веб-приложение: Уровень представления получает или отправляет данные с сервера/на сервер через объекты передачи.

Преимущества

  1. Сокращение накладных расходов на сетевое взаимодействие: Уменьшает количество сетевых запросов за счёт одновременной передачи нескольких элементов данных.
  2. Инкапсуляция: Объект передачи служит носителем инкапсуляции данных, скрывая внутреннюю структуру данных.
  3. Простота поддержки: Централизованно управляет передаваемыми данными, легко модифицировать и расширять.

Недостатки

  • Чрезмерное использование: Может увеличить сложность системы из-за создания слишком большого количества объектов передачи.

Рекомендации по использованию

  • Когда между разными слоями в многоуровневом приложении требуется передавать большие объёмы данных, рассмотрите возможность использования шаблона Transfer Object.

Примечания

  • Transfer-объекты должны оставаться легковесными и не должны содержать избыточную бизнес-логику.

Несколько основных задействованных ролей

  1. Класс Transfer Object:

    • Инкапсулирует данные, которые необходимо передать.
  2. Слой доступа к данным:

    • Предоставляет данные и может отвечать за заполнение transfer-объектов данными.
  3. Слой бизнес-логики (необязательно):

    • Необязательный, обрабатывает бизнес-логику, может использовать transfer-объекты.
  4. Слой представления или клиент:

    • Использует transfer-объекты для передачи данных или отправки запросов.

Шаблон Transfer Object предоставляет эффективный способ сократить время сетевого взаимодействия и упростить процесс передачи данных за счёт инкапсуляции передаваемых данных в объект.


Реализация

Мы создадим один как бизнес-объектStudentBOи один как объект передачиStudentVO, которые оба представляют нашу сущность.

TransferObjectPatternDemoКласс здесь выступает в роли клиента и будет использоватьStudentBOиStudentдля демонстрации шаблона проектирования «Объект передачи».

传输对象模式的 UML 图

Шаг 1

Создайте объект передачи.

StudentVO.java

public class StudentVO { private String name; private int rollNo; StudentVO(String name, int rollNo){ this.name = name; this.rollNo = rollNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getRollNo() { return rollNo; } public void setRollNo(int rollNo) { this.rollNo = rollNo; } }

Шаг 2

Создайте бизнес-объект.

StudentBO.java

import java.util.ArrayList; import java.util.List; public class StudentBO { //Списки рассматриваются как база данных List<StudentVO> students; public StudentBO(){ students = new ArrayList<StudentVO>(); StudentVO student1 = new StudentVO("Robert",0); StudentVO student2 = new StudentVO("Джон",1); students.add(student1); students.add(student2); } public void deleteStudent(StudentVO student) { students.remove(student.getRollNo()); System.out.println("Студент: Номер " + student.getRollNo() +", удалён из базы данных"); } //Получить список студентов из базы данных public List<StudentVO> getAllStudents() { return students; } public StudentVO getStudent(int rollNo) { return students.get(rollNo); } public void updateStudent(StudentVO student) { students.get(student.getRollNo()).setName(student.getName()); System.out.println("Студент: Номер " + student.getRollNo() +", обновлён в базе данных"); } }

Шаг 3

ИспользованиеStudentBOдля демонстрации шаблона проектирования Transfer Object.

TransferObjectPatternDemo.java

public class TransferObjectPatternDemo { public static void main(String[] args) { StudentBO studentBusinessObject = new StudentBO(); //Вывести всех студентов for (StudentVO student : studentBusinessObject.getAllStudents()) { System.out.println("Студент: [Номер : " +student.getRollNo()+", Имя : "+student.getName()+" ]"); } //Обновить студента StudentVO student =studentBusinessObject.getAllStudents().get(0); student.setName("Michael"); studentBusinessObject.updateStudent(student); //Получить студента studentBusinessObject.getStudent(0); System.out.println("Студент: [Номер : " +student.getRollNo()+", Имя : "+student.getName()+" ]"); } }

Шаг 4

Запустите программу и выведите результат:

Student: [RollNo : 0, Name : Robert ]
Student: [RollNo : 1, Name : John ]
Student: Roll No 0, updated in the database
Student: [RollNo : 0, Name : Michael ]
Другие расширения