転送オブジェクトパターン

転送オブジェクトパターン(Transfer Object Pattern)は、クライアントからサーバーへ一度に複数の属性を持つデータを転送するために使用されます。転送オブジェクトは値オブジェクトとも呼ばれます。転送オブジェクトは、getter/setter メソッドを持つ単純な POJO クラスであり、シリアライズ可能なので、ネットワーク経由で転送できます。それはいかなる振る舞いも持ちません。サーバー側のビジネスクラスは通常、データベースからデータを読み取り、POJO を埋めてから、クライアントに送信するか、値を渡します。クライアントにとって、転送オブジェクトは読み取り専用です。クライアントは独自の転送オブジェクトを作成し、それをサーバーに渡して、データベースの値を一度に更新できます。以下はこのデザインパターンのエンティティです。

  • ビジネスオブジェクト(Business Object)- 転送オブジェクトにデータを埋めるビジネスサービス。
  • 転送オブジェクト(Transfer Object)- 単純なPOJOで、プロパティを設定/取得するメソッドのみを持つ。
  • クライアント(Client)- クライアントはリクエストを送信したり、転送オブジェクトをビジネスオブジェクトに送信したりできます。

概要

意図

ネットワークまたはアプリケーション層間のデータ転送を簡素化するために使用されます。転送が必要なデータを表す複数の属性を含むクラスを作成することで、データをカプセル化します。

主に解決する問題

  • 分散システム、特に多層アプリケーションにおいて、層間でデータを転送する際の効率性とカプセル化の問題を解決します。

使用シーン

  • クライアントとサーバー間で大量のデータを転送する必要がある場合、特にWebサービスやリモートプロシージャコール(RPC)で使用します。

実装方法

  • 転送オブジェクトクラス:転送が必要なデータを表す複数の属性を含むクラスを定義します。
  • データアクセス層:データベースやその他のデータソースからデータを抽出し、転送オブジェクトに埋める役割を担います。
  • ビジネスロジック層:任意。ビジネスロジックを処理し、転送オブジェクトを使用する場合があります。
  • プレゼンテーション層またはクライアント:転送オブジェクトを使用してデータを表示したり、ユーザー入力のデータキャリアとして使用したりします。

主要なコード

  • 転送オブジェクトクラス:データのカプセル化と転送のために、属性と場合によってはビジネスロジックを含みます。

応用事例

  • Webアプリケーション:プレゼンテーション層は転送オブジェクトを介してサーバーからデータを取得または送信します。

長所

  1. ネットワーク通信オーバーヘッドの削減:複数のデータを一度に転送することで、ネットワークリクエストの回数を減らします。
  2. カプセル化:転送オブジェクトがデータのカプセル化の担い手となり、内部のデータ構造を隠します。
  3. 保守が容易:転送データを集中管理するため、修正や拡張が容易です。

短所

  • 過度な使用:転送オブジェクトを過剰に作成すると、システムの複雑性が増す可能性があります。

使用上の推奨

  • 多層アプリケーションの異なる層間で大量のデータを転送する必要がある場合は、転送オブジェクトパターンの使用を検討してください。

注意事項

  • 転送オブジェクトは軽量に保つべきであり、過剰なビジネスロジックを含めないようにしてください。

含まれる主要な役割

  1. 転送オブジェクトクラス(Transfer Object Class):

    • 転送が必要なデータをカプセル化します。
  2. データアクセス層(Data Access Layer):

    • データを提供し、データを転送オブジェクトに埋める役割を担う場合があります。
  3. ビジネスロジック層(Business Logic Layer)(任意):

    • 任意。ビジネスロジックを処理し、転送オブジェクトを使用する場合があります。
  4. プレゼンテーション層またはクライアント(Presentation Layer or Client):

    • 転送オブジェクトを使用してデータを表示したり、リクエストを送信したりします。

転送オブジェクトパターンは、転送データを1つのオブジェクトにカプセル化することで、ネットワーク通信の回数を減らし、データ転送プロセスを簡素化する効果的な方法を提供します。


実装

ビジネスオブジェクトとして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("John",1); students.add(student1); students.add(student2); } public void deleteStudent(StudentVO student) { students.remove(student.getRollNo()); System.out.println("Student: Roll No " + student.getRollNo() +", deleted from database"); } //データベースから学生リストを取得します。 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: Roll No " + student.getRollNo() +", updated in the database"); } }

ステップ 3

使用するStudentBO転送オブジェクトのデザインパターンをデモンストレーションするために。

TransferObjectPatternDemo.java

public class TransferObjectPatternDemo { public static void main(String[] args) { StudentBO studentBusinessObject = new StudentBO(); //すべての学生を出力します。 for (StudentVO student : studentBusinessObject.getAllStudents()) { System.out.println("Student: [RollNo : " +student.getRollNo()+", Name : "+student.getName()+" ]"); } //学生を更新します。 StudentVO student =studentBusinessObject.getAllStudents().get(0); student.setName("Michael"); studentBusinessObject.updateStudent(student); //学生を取得します。 studentBusinessObject.getStudent(0); System.out.println("Student: [RollNo : " +student.getRollNo()+", Name : "+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 ]
その他の拡張