Javaにおける通知パターン:イベントアラートによるシステム通信の強化
別名
- イベントリスナー
通知デザインパターンの意図
Javaにおける通知デザインパターンは、オブジェクトが特定のイベントを購読し、それらのイベントが発生したときに非同期で更新を受信できるようにすることで、システムの異なる部分間の非同期通信を促進することを目的としています。
現実世界の例を用いた通知パターンの詳細な説明
現実世界の例
気象警報システムを、通知デザインパターンの現実世界における類似例と考えてみましょう。このシステムでは、気象観測所は、気温、湿度、暴風雨警報などの気象条件に関するデータを収集します。ニュース機関、スマートフォンの天気アプリ、緊急サービスなど、複数の購読者は、激しい嵐や異常気象など、特定の気象イベントに関する更新の受信に関心を持っています。
気象観測所が重要なイベントを検出すると、この情報を公開します。購読しているすべてのエンティティは、気象観測所がこれらの購読者の詳細を知る必要なく、これらの更新を自動的に受信します。たとえば、ニュース機関はこの情報を使用して気象レポートを更新し、緊急サービスは潜在的な災害に備えるためにこの情報を使用する可能性があります。このシステムは、通知パターンがパブリッシャー(気象観測所)をその購読者から分離し、タイムリーな更新を効率的に配信する能力を実証しています。
簡単な言葉で
通知デザインパターンにより、オブジェクトは購読者の詳細を知らなくても、関心のあるオブザーバーのリストに変更やイベントについて自動的に通知できます。
Javaにおける通知パターンのプログラム例
Javaの通知パターンは、層間で渡される情報をキャプチャし、情報を検証し、必要に応じてエラーをプレゼンテーション層に返すために使用されます。イベントのプロデューサーとコンシューマー間の結合を減らし、コンポーネントの柔軟性と再利用性を高め、動的なイベントの購読と購読解除を可能にします。
この例では、フォーム送信のシナリオを使用して通知パターンを実証します。このフォームは、作業員の氏名、職業、生年月日を登録するために使用されます。フォームデータは検証のためにドメイン層に渡され、エラーはプレゼンテーション層に返されます。
プレゼンテーション層として機能する`RegisterWorkerForm`クラスです。作業員の詳細を入力として受け取り、フォームを送信します。
class RegisterWorkerForm {
private RegisterWorkerForm registerWorkerForm;
RegisterWorkerForm(String name, String occupation, LocalDate dateOfBirth) {
// Initialize the form with the worker's details
}
void submit() {
// Submit the form
// If there are any errors, they will be captured in the worker's notification
}
}
`RegisterWorker`クラスはドメイン層として機能します。作業員の詳細を検証し、`RegisterWorkerDto`を通じてエラーを返します。
class RegisterWorker {
RegisterWorker(String name, String occupation, LocalDate dateOfBirth) {
// Validate the worker's details
// If there are any errors, add them to the notification
}
}
最後に、`App`クラスはフォームが作成され、送信される場所です。
public class App {
public static void main(String[] args) {
var form = new RegisterWorkerForm("John Doe", "Engineer", LocalDate.of(1990, 1, 1));
form.submit();
}
}
この例では、作業員の詳細が無効な場合(例:名前が空の場合)、`RegisterWorker`クラスは通知にエラーを追加します。`RegisterWorkerForm`クラスは、送信後に通知にエラーがないかを確認できます。これは、情報が層間で渡され、エラーがプレゼンテーション層に返される通知パターンを示しています。
フォームは送信を処理し、これらのエラーメッセージをユーザーに返して、通知が機能したことを示します。
出力例
18:10:00.075 [main] INFO com.iluwatar.RegisterWorkerForm - Error 1: Name is missing: ""
18:10:00.079 [main] INFO com.iluwatar.RegisterWorkerForm - Error 2: Occupation is missing: ""
18:10:00.079 [main] INFO com.iluwatar.RegisterWorkerForm - Error 4: Worker registered must be over 18: "2016-07-13"
18:10:00.080 [main] INFO com.iluwatar.RegisterWorkerForm - Not registered, see errors
Javaで通知パターンを使用する場合
- 1つのオブジェクトへの変更が他のオブジェクトの変更を必要とする場合、および変更する必要があるオブジェクトの数がわからない場合。
- 抽象化に2つの側面があり、一方が他方に依存している場合。これらの側面を別々のオブジェクトにカプセル化することで、個別に変更および再利用できます。
- システムコンポーネントが、システムの他のコンポーネントについて想定することなく、イベントの通知を受ける必要がある場合。
Javaにおける通知パターンの実際のアプリケーション
- ユーザーのアクションがアプリケーションの応答をトリガーするGUIフレームワーク。
- 大規模分散システムにおける通知システム。
- マイクロサービスアーキテクチャにおけるイベント管理。
通知パターンの利点と欠点
利点
- イベントのプロデューサーとコンシューマー間の結合を軽減します。
- コンポーネントの柔軟性と再利用性を高めます。
- イベントの動的な購読と購読解除を可能にします。
トレードオフ
- 購読の動的な性質により、適切に管理しないと複雑なシステムになる可能性があります。
- イベントの非同期性と分離性のため、デバッグが難しい場合があります。
関連するJavaデザインパターン
- コマンド:リクエストをオブジェクトとしてカプセル化するために使用でき、多くの場合、送信者と受信者を分離するために通知と組み合わせて使用されます。
- メディエーター:オブジェクト間の集中化された通信を促進しますが、通知パターンはより分散化されています。
- オブザーバー:通知パターンの基礎パターンであり、1対多の依存関係に焦点を当てています。