デザインパターンについて

デザインパターン は、一般的であり、繰り返し起こる問題を解決する実証済みの解決策です。アブストラクションレベルでは、しばしば、問題に対する専門的な解決策をデザインパターンで記述します。

パターンによって、開発者は、問題を個々の要素に分けることができるようになります。これにより、コードの保守性や再利用性が高くなり、コードも理解しやすくなります。また、デザインパターンの要素もカスタマイズや埋め込みが可能で、互いに自在に結合します。パターンの部品は、アプリケーションを中断することなく追加または削除を行うことができます。このような透明性により、作業上の矛盾を最小限に抑えながら、さまざまなタイプの開発者がプロジェクトに取り組むことができます。

この章では、J2EE コンテキストでのデザインパターンについて説明していきますが、これらの多数の技術はどのようなプログラミング環境にも応用できます。

パターンテンプレート

通常、パターンはテンプレートフォームで作成します。1 つのパターンで複数のパターンを記述する場合もあります。この章では、デザインパターンを構成して記述するための簡略化されたテンプレートを使用します。次の表で、このテンプレートを説明します。
セクション
説明
名前
パターンの一般名。
問題
開発者が直面するデザイン上の課題を説明します。
解決策
問題を解決するための高レベルアプローチ。
戦略
低レベルにおけるパターンの実装方法を説明します。

Sun の Web サイトに掲載されているデザインパターンカタログには、より強力なテンプレートが紹介されています。Sun テンプレートには、目的、動機、応用性、構造、参加者、コラボレーション、結果、実装が含まれています。詳細については、http://java.sun.com/blueprints/patterns/j2ee_patterns を参照してください。

『Core J2EE Patterns』には、コンテキスト、問題、フォース、解決策、および結果を定義したテンプレートを若干変更したものを紹介しています。

階層手法

デザインパターンの実装には、Web アプリケーション構築のための階層手法を使用する必要があります。これらの階層は次の要素で構成されています。

次の図は、各階層と互いの関係を示しています。

これは、Web アプリケーションの 5 つの階層のイメージを示しています。

クライアント層

クライアント層は、アプリケーションにアクセスするすべてのデバイスおよびシステムで構成されます。これらのデバイスやシステムには次のものがあります。

各タイプのクライアントはさまざまな方法でアプリケーションと通信するので、Web アプリケーションからクライアント層を分離すると便利です。クライアントを識別し、適切な形式のデータを返す役割は、クライアント層の下の階層が担当します。

プレゼンテーション層

プレゼンテーション層には、ユーザーインターフェイス、認証、承認の構築やセッションステートの管理などのプレゼンテーションロジックがカプセル化されています。プレゼンテーション層は、ビジネス層にアクセスするためのさまざまな方法をクライアントに提供します。この階層はビューとも呼ばれます。

J2EE では、プレゼンテーション層は、サーブレットおよび JSP として実装されます。これらのコンポーネントは、クライアントビューを簡単に生成できるように特別にデザインされています。各クライアントには、さまざまな形式のデータが必要になります。プレゼンテーション層は、アプリケーションのロジックから出力 (またはレスポンス) の形式を分離するのに役立ちます。

ほとんどのパターンのデザインには、いくつかのフォームのプレゼンテーション層があります。次のパターンにはプレゼンテーション層が含まれています。

ビジネス層

ビジネス層は、アプリケーションのビジネスロジックを担当します。ビジネス層は、プレゼンテーション層からの変数データおよびユーザー入力に基づいて出力を生成し、プレゼンテーション層に渡します。ビジネス層は通常、EJB として実装されますが、サーブレットおよび JavaBeans が含まれている場合があります。ビジネス層は、しばしばヘルパークラスという形態をとります。

インテグレーション層

インテグレーション層は、データベース、CRM システム、レガシーアプリケーションなどの外部リソースとの通信の管理を担当します。

階層とロール

よくデザインされた Web アプリケーションの階層は、J2EE プラットフォームのロール (役割) の定義に相当します。J2EE プラットフォームでは、Web アプリケーションの開発ライフサイクルの中で、さまざまな人々が個々のロールを担当します。これらの人々はそれぞれ、次の表に示すように Web アプリケーションの 1 つのロールを担当します。
ロール
担当
アプリケーション
コンポーネント
プロバイダ
アプリケーションの構成要素を記述します。
さまざまな階層で作業を行うことができます。このプロバイダは、生成するコンポーネントのタイプによってさまざまなロールに分けられます。このようなコンポーネントのタイプには、プレゼンテーションコンポーネント (グラフィックデザイナーおよび HTML コーダー) やビジネスロジック (EJB として実装) などがあります。
アプリケーション
アセンブル担当者
アプリケーションコンポーネントプロバイダによって提供されたコンポーネントを J2EE アプリケーションにまとめます。
アプリケーションを、基盤リソースへの直接リファレンスから
分離します。
また、インテグレーション層におけるリソースも担当します。
デプロイ担当者デプロイ担当者
特定の環境におけるアプリケーションの設定を担当します。
通常はリソース層を担当します。
システム管理者
ランタイム環境においてアプリケーションの管理と監視を担当
します。
通常は、Web アプリケーション構造のいずれの階層においてもロールを担当することはありません。

しばしば、1 人の人間が複数のロールと作業を担当します。デザインパターンは、疎結合性を利用することによってアプリケーションコンポーネントの独立性を維持するのに役立ちます。たとえば、データベースインテグレーションロジックはプレゼンテーションロジックから分離する必要があります。依存関係を排除することにより、アプリケーションはさまざまなシステムおよびプラットフォームに移植できるようになります。

クラスやコンポーネントが属している階層が明確に識別できない場合はデザインに問題があります。たとえば、データベースにアクセスする JSP があると、その JSP がプレゼンテーション層に属しているのか、インテグレーション層に属しているのかを識別できません。

MVC (Model-View-Controller)

MVC (Model-View-Controller) デザインパターンはよく知られているデザインパターンです。MVC デザインパターンは、アプリケーションを 3 つの層に分けて定義します。
説明
モデル
アプリケーション内のビジネスロジック。前述のビジネス層
およびインテグレーション層に相当します。
EJB およびサーブレットとして実装され、しばしばヘルパー
クラスで構成されます。
ビュー
アプリケーション内のプレゼンテーションロジック。前述の
プレゼンテーション層に相当します。
しばしば JSP およびサーブレットとして実装されます。
コントローラ
アプリケーションの最初の接触ポイント。リクエストをディスパッチし、認証、承認、および他のアプリケーション動作およびシステムを実装します。
前のクライアント層およびプレゼンテーション層の間に位置
します。
しばしばサーブレットまたは JSP として実装されます。

MVC アプリケーションには、コントローラを変更することによって、新規クライアントビューを追加したり、アプリケーションとのクライアント対話をすばやく更新したりできるという利点があります。

次の図にこの戦略を示します。

このイメージは、クライアント - コントローラ - ビュー - モデルという直線的なリクエスト処理を示しています。

MVC の最も一般的な実装は Struts フレームワークです。詳細については、 「Struts について」 を参照してください。MVC パターンは、Dispathcer View パターンおよびこの章で説明している他のいくつかのパターンに密接に関連しています。

パターンの実装を支援するコンポーネント

J2EE には、デザインパターンの概念構造をエミュレートするのに役立つ多数のコンポーネントやアブストラクションが用意されています。これらの一部のツールの機能は重複していますが、全体的な構造では独自の能力を発揮します。次の表で、これらのツールの一部について説明します。
コンポーネント
デザインパターンとの関係
JavaBeans
JSP およびサーブレットがビュー外部でビジネスロジックを実行
する際に支援します。ステート情報を保管します。
EJB
スケーラブルなエンタープライズビジネスロジックを実行します。
JSP
プレゼンテーション層またはビュー層に使用します。基本的にビューロジックが含まれています。
サーブレット
コントローラ、フィルタ、ビジネスロジック、またはヘルパー
クラスとして動作する汎用性クラス。
ヘルパークラス
特定のクラスを実行します。
ビューからのビジネスロジックの分離に役立ちます。
ビューからモデルへのアクセスを提供します。
ファクトリクラス
オブジェクトの特殊な生成および廃棄を実装します。
データアクセス
オブジェクト
特殊なデータベースロジックを他のコンポーネントから分離します。
カスタムタグ
ライブラリ
JSP からのビジネスロジックの削除に役立ちます。
モデルからビューへのアクセスを提供します。
フィルタ
リクエストの前処理および後処理。
リクエストを転送できるため、Front Controller として適しています。
イベントリスナ
サーブレットおよび JSP からビジネスロジックを分離するのに
役立ちます。
ロギング、初期化、オブジェクトの廃棄、ファクトリアクセス
などの管理ロジックを提供します。