コアJ2EEパターン - Business Delegateパターン
2008/07/11 00:57Update
Business Delegate(ビジネス・代理)パターンは コアJ2EEパターン の一つであり、多層で分散するJ2EEアプリケーションにおいて、プレゼンテーション層とビジネスロジック層の間に、ビジネスロジックを代理するクラスを配置して、プレゼンテーション層とビジネス層を分離する役割を果たします。
本文は「問題」、「解決策」、「戦略」、「メリット」、「実装例」などからBusiness Delegateパターンについて説明します。
デザインが不適切な多くの多層分散のJ2EEアプリケーションでは、プレゼンテーション層のコンポーネントは、直接ビジネス層のコンポーネントを呼び出します。その結果、
◇ 密な結合度。ビジネス層のインタフェースを多くのプレゼンテーション層に見えてしまい、密な結合度になってしまいます。
※結合度が低いほどモジュールの安定性が強い
◇ 性能低下。リモートコールによるビジネスロジック層の多くのコンポーネントとのやり取りでネットワークに加担してしまい、性能に低下する恐れがあります。
◇ 複雑化。一つの業務を遂行するのに、大量な呼び出しをしてしまい、その結果システムが複雑になってしまいます。
◇ 重複コード。ビジネスロジック層のコンポーネントとのやり取りを各プレゼンテーションのコンポーネントに分散してしまうため、コードの重複が発生します。
Business Delegateパターンはそれらの問題を解決します。
Use a Business Delegate to reduce coupling between presentation-tier clients and business services. The Business Delegate hides the underlying implementation details of the business service, such as lookup and access details of the EJB architecture.
Business Delegateを利用し、プレゼンテーション層とビジネスサービス間の結合度を減らします。Business Delegateはビジネスサービスの実装の詳細、例えばEJBアーキテクチャの詳細や、それにlookup/アクセスするための具体的な方法などを隠蔽します。
<<Business Delegateパターンの構造図>>

ClientはBusiness Delegateを経由するBusiness Serviceを呼び出します。まだ、Business Serviceを検索・生成するには、LookupServiceを利用する手法もあります。
Business Delegateパターンを利用することは、次のようなメリットがあると考えられます。
◇ 疎結合度の実現。Business Delegateはビジネスサービスの実装の詳細を隠蔽し、プレゼンテーション層はBusiness Delegateを経由でビジネスサービスを透過的にアクセスできます。
◇ 集中管理。プレゼンテーション層はビジネスサービスへの呼び出しはBusiness Delegateに集中して管理できます。ロジックが変化しても、Delegate Businessを修正するだけでよい。
◇ エラー・異常の検知・管理。Delegate Businessはビジネスサービスの異常を検知(catch)し、プレゼンテーション層に容易に理解できるビジネス異常を変換することができます。◇ 共通する処理の行う。Delegate Businessはアクセスの集中管理することで、キャッシュなどの共通する処理を行うことができます。
◇ インタフェースの簡素化。プレゼンテーション層に簡単なインタフェースを提供することが可能です。
Delegate Proxy Strategy:
Business DelegateパターンをProxy「GoF」パターンで実装する戦略です。
Delegate Adapter Strategy:
Business DelegateパターンをAdapter「GoF」パターンで実装する戦略です。
サンプルからBusiness Delegateパターンについて理解を深めます。
しかし、このサンプルはあくまで擬似的なコードしか書かれておりませんので、実際の実行までできません。
次のようなビジネスサービスインタフェースがあるとします。
また、実装方法としてはEJB2.0よって実装されていることとします。プレゼンテーション層のコンポーネント(JSP、SERVLET、View Helperなど)から直接該当EJBコンポーネントを呼び出してしまうと、各クライアント(JSPなど)のコードでEJBコンポーネントを呼び出すためのlookup方法などを書かなければなりません。その結果、JSP、SERVLET、View HelperなどのクライアントはEJB2.0技術に依存してしまいます。
Business Delegateパターンでの実装例
そして、プレゼンテーション層からの呼び出す方法は次のようになります。
これで、プレゼンテーション層からビジネスサービスのコードへの依存を完全に除去することができます。ビジネスサービスはEJB2.0であろうか、EJB3、Hibernate、JDO、JDBCなどであろうか、プレゼンテーション層と完全に切り離すことになります。
◇ Service Locatorパターン
Business Delegateでは、Service Locatorパターンを利用してビジネスコンポーネントを検索・生成する手法があります。
◇ Proxy [GoF]
Business DelegateパターンをProxy「GoF」パターンで実装する戦略があります。
◇ Adapter [GoF]
Business DelegateパターンをAdapter「GoF」パターンで実装する戦略があります。
◇ Broker [POSA1]
Business Delegateは、ビジネスコンポーネントとクライアント間の高結合度を打破します。
Core J2EE Pattern Catalog 
Core J2EE Patterns - Business Delegate
問題
デザインが不適切な多くの多層分散のJ2EEアプリケーションでは、プレゼンテーション層のコンポーネントは、直接ビジネス層のコンポーネントを呼び出します。その結果、
◇ 密な結合度。ビジネス層のインタフェースを多くのプレゼンテーション層に見えてしまい、密な結合度になってしまいます。
※結合度が低いほどモジュールの安定性が強い
◇ 性能低下。リモートコールによるビジネスロジック層の多くのコンポーネントとのやり取りでネットワークに加担してしまい、性能に低下する恐れがあります。
◇ 複雑化。一つの業務を遂行するのに、大量な呼び出しをしてしまい、その結果システムが複雑になってしまいます。
◇ 重複コード。ビジネスロジック層のコンポーネントとのやり取りを各プレゼンテーションのコンポーネントに分散してしまうため、コードの重複が発生します。
Business Delegateパターンはそれらの問題を解決します。
解決策
Use a Business Delegate to reduce coupling between presentation-tier clients and business services. The Business Delegate hides the underlying implementation details of the business service, such as lookup and access details of the EJB architecture.
Business Delegateを利用し、プレゼンテーション層とビジネスサービス間の結合度を減らします。Business Delegateはビジネスサービスの実装の詳細、例えばEJBアーキテクチャの詳細や、それにlookup/アクセスするための具体的な方法などを隠蔽します。
<<Business Delegateパターンの構造図>>
ClientはBusiness Delegateを経由するBusiness Serviceを呼び出します。まだ、Business Serviceを検索・生成するには、LookupServiceを利用する手法もあります。
メリット
Business Delegateパターンを利用することは、次のようなメリットがあると考えられます。
◇ 疎結合度の実現。Business Delegateはビジネスサービスの実装の詳細を隠蔽し、プレゼンテーション層はBusiness Delegateを経由でビジネスサービスを透過的にアクセスできます。
◇ 集中管理。プレゼンテーション層はビジネスサービスへの呼び出しはBusiness Delegateに集中して管理できます。ロジックが変化しても、Delegate Businessを修正するだけでよい。
◇ エラー・異常の検知・管理。Delegate Businessはビジネスサービスの異常を検知(catch)し、プレゼンテーション層に容易に理解できるビジネス異常を変換することができます。◇ 共通する処理の行う。Delegate Businessはアクセスの集中管理することで、キャッシュなどの共通する処理を行うことができます。
◇ インタフェースの簡素化。プレゼンテーション層に簡単なインタフェースを提供することが可能です。
戦略
Delegate Proxy Strategy:
Business DelegateパターンをProxy「GoF」パターンで実装する戦略です。
Delegate Adapter Strategy:
Business DelegateパターンをAdapter「GoF」パターンで実装する戦略です。
実装例
サンプルからBusiness Delegateパターンについて理解を深めます。
しかし、このサンプルはあくまで擬似的なコードしか書かれておりませんので、実際の実行までできません。
次のようなビジネスサービスインタフェースがあるとします。
public interface IOrderBook {
public boolean order(String bookId);
public boolean cancel(String bookId);
}
また、実装方法としてはEJB2.0よって実装されていることとします。プレゼンテーション層のコンポーネント(JSP、SERVLET、View Helperなど)から直接該当EJBコンポーネントを呼び出してしまうと、各クライアント(JSPなど)のコードでEJBコンポーネントを呼び出すためのlookup方法などを書かなければなりません。その結果、JSP、SERVLET、View HelperなどのクライアントはEJB2.0技術に依存してしまいます。
Business Delegateパターンでの実装例
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.naming.NamingException;
public class OrderBookDelegate implements IOrderBook {
IOrderBook orderBook = null;
public OrderBookDelegate() {
init();
}
private void init() {
try {
// ServiceLocatorについて、ここでは、具体的な実装を書いていません
OrderBookHome home = ServiceLocator.getInstance().getHome("java:comp/env/ejb/OrderBookHome", OrderBookHome.class);
orderBook = home.create();
} catch (NamingException e) {
throw new MyBusinessException(e);
} catch (CreateException e) {
throw new MyBusinessException(e);
} catch (RemoteException e) {
throw new MyBusinessException(e);
}
}
public boolean order(String bookId) {
return orderBook.order(bookId);
}
public boolean cancel(String bookId) {
return orderBook.cancel(bookId);
}
}
そして、プレゼンテーション層からの呼び出す方法は次のようになります。
IOrderBook orderBook = new OrderBookDelegate();
orderBook.order("mybook");
これで、プレゼンテーション層からビジネスサービスのコードへの依存を完全に除去することができます。ビジネスサービスはEJB2.0であろうか、EJB3、Hibernate、JDO、JDBCなどであろうか、プレゼンテーション層と完全に切り離すことになります。
関連パターン
◇ Service Locatorパターン
Business Delegateでは、Service Locatorパターンを利用してビジネスコンポーネントを検索・生成する手法があります。
◇ Proxy [GoF]
Business DelegateパターンをProxy「GoF」パターンで実装する戦略があります。
◇ Adapter [GoF]
Business DelegateパターンをAdapter「GoF」パターンで実装する戦略があります。
◇ Broker [POSA1]
Business Delegateは、ビジネスコンポーネントとクライアント間の高結合度を打破します。
その他参考資料
Core J2EE Pattern Catalog 
Core J2EE Patterns - Business Delegate
Sponsored Link
- Relative Articles
- ASP.NETでのフロント・コントローラ(Front Controller)実装 - (2009/10/20 15:22)
- Factory Method パターン - ファクトリメソッドパターン - (2008/06/09 22:44)
- Abstract Factory パターン - 抽象ファクトリパターン - (2008/06/10 13:25)
- Singleton パターン - シングルトンパターン - (2008/06/10 15:36)
- Prototypeパターン - プロトタイプパターン - (2008/06/10 17:23)
- Builderパターン - ビルダーパターン - (2008/06/10 19:01)
- Adapter パターン - アダプターパターン - (2008/06/11 11:30)
- Composite パターン - コンポジットパターン - (2008/06/11 16:59)
- Interpreter パターン - インタプリタパターン - (2008/06/13 15:42)
- Chain of Responsibility パターン - 責任の連鎖パターン - (2008/06/14 00:28)