Javaにおけるビジネスデリゲートパターン:ビジネスサービスインタラクションの簡略化
別名
- サービス担当者
ビジネスデリゲートデザインパターンの意図
ビジネスデリゲートパターンは、プレゼンテーション層とビジネス層の間に抽象化レイヤーを追加するJavaの構造デザインパターンです。このパターンを使用することにより、層間の疎結合を実現し、アプリケーションを構成するビジネスオブジェクトの場所、接続方法、および対話方法に関する知識をカプセル化します。
実際の例を用いたビジネスデリゲートパターンの詳細な説明
実世界の例
Java EEを使用するエンタープライズアプリケーションでは、ビジネスデリゲートパターンは、異なるビジネスサービス間のインタラクションを管理するのに役立ちます。
レストランを想像してください。ここでは、ウェイターが顧客とキッチンとの間の仲介役を務めます。顧客が注文をすると、ウェイターは注文をキッチンに持って行き、特定の要望を伝え、後で調理された食べ物を顧客に運びます。ウェイターは、キッチンの操作の複雑さを顧客から抽象化し、シェフが顧客と直接対話する必要なく、調理のみに集中できるようにします。この設定により、顧客サービス(プレゼンテーション層)とキッチン(ビジネスサービス)の両方が独立して効率的に動作できます。ウェイターはビジネスデリゲートとして機能し、コミュニケーションを管理し、2つの異なる領域間のスムーズなインタラクションを保証します。
平易な言葉で
ビジネスデリゲートは、プレゼンテーション層とビジネス層の間に抽象化レイヤーを追加します。
Wikipediaによると
ビジネスデリゲートはJava EEデザインパターンです。このパターンは、ビジネスサービスと接続されたプレゼンテーション層間の結合を減らし、サービスの実装の詳細(EJBアーキテクチャのルックアップとアクセシビリティを含む)を隠すことを目的としています。ビジネスデリゲートは、プレゼンテーション層からビジネスオブジェクトを呼び出すためのアダプターとして機能します。
Javaにおけるビジネスデリゲートパターンのプログラミング例
次のJavaコードは、ビジネスデリゲートパターンの実装方法を示しています。このパターンは、疎結合と効率的なサービスインタラクションを必要とするアプリケーションで特に役立ちます。
携帯電話アプリケーションは、存在するすべての映画をデバイスにストリーミングすることを約束します。ユーザーの検索文字列をキャプチャし、これをビジネスデリゲートに渡します。ビジネスデリゲートは、最適なビデオストリーミングサービスを選択し、そこからビデオを再生します。
まず、ビデオストリーミングサービスの抽象化といくつかの実装があります。
public interface VideoStreamingService {
void doProcessing();
}
@Slf4j
public class NetflixService implements VideoStreamingService {
@Override
public void doProcessing() {
LOGGER.info("NetflixService is now processing");
}
}
@Slf4j
public class YouTubeService implements VideoStreamingService {
@Override
public void doProcessing() {
LOGGER.info("YouTubeService is now processing");
}
}
次に、どのビデオストリーミングサービスを使用するかを決定するルックアップサービスがあります。
@Setter
public class BusinessLookup {
private NetflixService netflixService;
private YouTubeService youTubeService;
public VideoStreamingService getBusinessService(String movie) {
if (movie.toLowerCase(Locale.ROOT).contains("die hard")) {
return netflixService;
} else {
return youTubeService;
}
}
}
ビジネスデリゲートは、ビジネスルックアップを使用して、映画の再生リクエストを適切なビデオストリーミングサービスにルーティングします。
@Setter
public class BusinessDelegate {
private BusinessLookup lookupService;
public void playbackMovie(String movie) {
VideoStreamingService videoStreamingService = lookupService.getBusinessService(movie);
videoStreamingService.doProcessing();
}
}
モバイルクライアントは、ビジネスデリゲートを利用してビジネス層を呼び出します。
public class MobileClient {
private final BusinessDelegate businessDelegate;
public MobileClient(BusinessDelegate businessDelegate) {
this.businessDelegate = businessDelegate;
}
public void playbackMovie(String movie) {
businessDelegate.playbackMovie(movie);
}
}
最後に、完全な例を実際に示すことができます。
public static void main(String[] args) {
// prepare the objects
var businessDelegate = new BusinessDelegate();
var businessLookup = new BusinessLookup();
businessLookup.setNetflixService(new NetflixService());
businessLookup.setYouTubeService(new YouTubeService());
businessDelegate.setLookupService(businessLookup);
// create the client and use the business delegate
var client = new MobileClient(businessDelegate);
client.playbackMovie("Die Hard 2");
client.playbackMovie("Maradona: The Greatest Ever");
}
こちらがコンソール出力です。
21:15:33.790 [main] INFO com.iluwatar.business.delegate.NetflixService - NetflixService is now processing
21:15:33.794 [main] INFO com.iluwatar.business.delegate.YouTubeService - YouTubeService is now processing
ビジネスデリゲートパターンのクラス図

Javaでビジネスデリゲートパターンを使用する場合
次の場合にビジネスデリゲートパターンを使用します
- プレゼンテーション層とビジネス層間の疎結合が必要な場合、またはサービスルックアップを抽象化する必要がある場合。
- 複数のビジネスサービスへの呼び出しを調整したい場合
- サービスルックアップとサービス呼び出しをカプセル化したい場合
- クライアント層とビジネスサービス間の通信を抽象化およびカプセル化する必要がある場合
ビジネスデリゲートパターンJavaチュートリアル
Javaにおけるビジネスデリゲートパターンの実世界での応用
- Java EE(Java Platform, Enterprise Edition)を使用するエンタープライズアプリケーション
- ビジネスサービスへのリモートアクセスを必要とするアプリケーション
ビジネスデリゲートパターンの利点とトレードオフ
利点
- プレゼンテーション層とビジネス層の疎結合:クライアント層とビジネスサービスが独立して進化できるようにします。
- 場所の透過性:クライアントは、ビジネスサービスの場所またはインスタンス化の変更による影響を受けません。
- 再利用とスケーラビリティ:ビジネスデリゲートオブジェクトは複数のクライアントで再利用でき、パターンは負荷分散とスケーラビリティをサポートします。
トレードオフ
- 複雑さ:追加のレイヤーと抽象化が導入され、複雑さが増す可能性があります。
- パフォーマンスオーバーヘッド:追加の間接参照により、わずかなパフォーマンスペナルティが発生する可能性があります。
関連するJavaデザインパターン
- サービスロケーター:ビジネスデリゲートは、サービスロケーターを使用してビジネスサービスを特定します。
- セッションファサード:ビジネスデリゲートは、セッションファサードを使用して、一連のビジネスサービスへの統一されたインターフェースを提供できます。
- コンポジットエンティティ:ビジネスデリゲートは、コンポジットエンティティを使用してビジネスサービスの状態を管理できます。