ビジネスデリゲートパターン
ビジネスデリゲートはJava EEのデザインパターン です。 [ 1 ]このパターンは、ビジネスサービスとそれに接続されたプレゼンテーション層の間の結合を減らし、サービスの実装の詳細( EJBアーキテクチャのルックアップとアクセス性を含む)を隠蔽することを目的としています。[ 1 ] [ 2 ]ビジネスデリゲートは、プレゼンテーション層からビジネスオブジェクトを呼び出すためのアダプタとして機能します。[ 3 ]
構造
基盤となるビジネスサービスへのアクセス要求はクライアントから送信され、ビジネスデリゲートはルックアップサービスを使用してビジネスサービスコンポーネントを見つけます。[ 1 ]
コンポーネント
基本コンポーネントは、ビジネス デリゲート、ルックアップ サービス、ビジネス サービスです。
ビジネス代表者
制御と保護はビジネスデリゲートを通じて提供されます。ビジネスデリゲートはIDなしとIDありの2種類の構造を持ちます。IDはEJBHomeやEJBObjectなどのリモートオブジェクトへの参照の文字列バージョンです。[ 1 ]
検索サービス
ビジネスサービスは、ビジネスデリゲートが使用するルックアップサービスによって特定されます。ビジネスサービスの検索の実装詳細は、ルックアップサービスによってカプセル化されています。[ 1 ]
ビジネスサービス
これは、エンタープライズBeanやJMSコンポーネントなどのビジネス層コンポーネントであり、クライアントに必要なサービスを提供します。[ 1 ]
結果
結果は次のとおりです。
- 中間ビジネス デリゲート レイヤーによってビジネス レイヤーがプレゼンテーション レイヤーから分離されるため、柔軟性と保守性が向上します。
- ビジネスデリゲートは、ビジネスロジックにアクセスするためにプレゼンテーション層に統一されたAPIを公開します。[ 1 ] [ 3 ]
懸念事項
次のような懸念事項が考えられます。
- アプリケーション内のクラス数を増やす追加レイヤーによるメンテナンス。
- ビジネスデリゲートはリモートビジネスオブジェクトインターフェースの変更に対応する必要がありますが、このような変更はまれです。[ 3 ]
サンプルコード
Web 層クライアントがセッション ファサード パターンを実装するセッション Bean にアクセスする必要があるプロフェッショナル サービス アプリケーション (PSA) のサンプル コードを以下に示します。
リソース委任者:
パブリッククラスResourceDelegate {// セッション ファサードのリモート参照private ResourceSession session ;//セッションファサードのホームオブジェクトのクラスprivate static final Class homeClazz = corepatterns.apps.psa.ejb.ResourceSessionHome.class ;// デフォルトのコンストラクター。ホームを検索し、新しいセッションを作成して接続します。public ResourceDelegate () throws ResourceException { try { ResourceSessionHome home = ( ResourceSessionHome ) ServiceLocator . getInstance (). getHome ( "Resource" , homeClazz ); session = home . create (); } catch ( ServiceLocatorException ex ) { // Service Locator 例外を// アプリケーション例外に変換します。 throw new ResourceException (...); } catch ( CreateException ex ) { // Session 作成例外を// アプリケーション例外に変換します。throw new ResourceException (...); } catch ( RemoteException ex ) { // Remote 例外を// アプリケーション例外に変換します。 throw new ResourceException (...); } }public BusinessDelegate ( String id )はResourceExceptionをスローします{ super (); reconnect ( id ); }public String getID () { try { return ServiceLocator . getId ( session ); } catch ( Exception e ) { // アプリケーション例外をスローする} }public void reconnect ( String id ) throws ResourceException { try { session = ( ResourceSession ) ServiceLocator.getService ( id ); } catch ( RemoteException ex ) { // リモート例外をアプリケーション例外に変換しますthrow new ResourceException ( ... ) ; } }public ResourceTO setCurrentResource ( String resourceId ) throws ResourceException { try { return session . setCurrentResource ( resourceId ); } catch ( RemoteException ex ) { // サービス例外を// アプリケーション例外に変換しますthrow new ResourceException (...); } }パブリックResourceTO getResourceDetails ()はResourceExceptionをスローします{try { return session . getResourceDetails (); } catch ( RemoteException ex ) { // サービス例外をアプリケーション例外に変換しますthrow new ResourceException (...); } }public void setResourceDetails ( ResourceTO vo ) throws ResourceException { try { session . setResourceDetails ( vo ); } catch ( RemoteException ex ) { throw new ResourceException (...); } }public void addNewResource ( ResourceTO vo ) throws ResourceException { try { session . addResource ( vo ); } catch ( RemoteException ex ) { throw new ResourceException (...); } }// その他すべてのプロキシ メソッドをセッション Bean へ... }