意味
オブザーバー パターンは、オブジェクト間の 1 対多の依存関係を確立するために使用される動作設計パターンです。オブジェクトの状態が変化すると、そのオブジェクトが依存する他のオブジェクトは自動的に通知を受け取り、それに応じて更新されます。
オブザーバー パターンには、2 つの中心的な役割があります。
サブジェクト: 監視対象オブジェクトまたは監視可能オブジェクトとも呼ばれ、オブザーバー オブジェクトのセットを維持し、オブザーバーを登録、削除、通知するメソッドを提供します。通常、トピックには、状態が変化したときにオブザーバーに通知する状態が含まれています。
オブザーバー: サブスクライバーまたはリスナーとしても知られ、トピックから通知を受信し、対応する操作を実行するためのインターフェイスまたは抽象クラスを定義します。オブザーバーは、トピックをサブスクライブすることでトピックの状態の変化に関心を示します。
オブザーバー パターンのワークフローは次のとおりです。
オブザーバーはトピック オブジェクトをサブスクライブすることによって自分自身を登録し、トピックはオブザーバーをオブザーバーのリストに追加します。
サブジェクトの状態が変化すると、サブジェクトはオブザーバーのリストを調べ、各オブザーバーの対応するメソッドを呼び出してオブザーバーに通知します。
通知を受信した後、オブザーバーはトピックのステータスに基づいて、対応する操作を更新または実行します。
オブザーバー パターンの利点は次のとおりです。
デカップリング: 被験者と観察者は疎結合であり、相互に影響を与えることなく独立して変更および拡張できます。
スケーラビリティ: 新しいオブザーバーを簡単に追加できるため、システムがより柔軟でスケーラブルになります。
一貫性: 被験者と観察者の間に 1 対多の関係が確立され、システムの一貫性が維持されます。
オブザーバー パターンは、実際のアプリケーションでよく使用されます。たとえば、GUI プログラミングでは、ウィジェットをテーマとして使用し、ユーザー インターフェイス要素をオブザーバーとして使用できます。ウィジェットのステータスが変化すると、オブザーバーはユーザー インターフェイスを自動的に更新できます。
オブザーバー パターンを使用する場合、不要な問題を防ぐために、オブザーバーとサブジェクト間の循環依存関係を回避する必要があることに注意してください。同時に、リソースのリークやパフォーマンスの問題を避けるために、サブスクリプションを適時にキャンセルするように注意する必要もあります。
Spring フレームワークはオブザーバー パターンをどのように使用してコンテナ全体のイベント メカニズムを実装しますか?
Spring フレームワークでは、コンテナ全体のイベント メカニズムは、アプリケーション コンテキスト (ApplicationContext) のイベント パブリッシュおよびリスニング メカニズムを通じて実装されます。このメカニズムを通じて、アプリケーションでコンテナレベルのイベントを定義して処理できます。
Spring のコンテナ全体のイベント メカニズムを使用するには、次の手順に従います。
- カスタム イベント クラスを作成する: まず、ApplicationEvent を継承し、イベント関連のプロパティとメソッドを定義するカスタム イベント クラスを作成する必要があります。
public class MyCustomEvent extends ApplicationEvent {
// 自定义事件的属性和方法
// ...
}
- イベント発行者の作成: イベントの発行を担当するコンポーネントまたはクラスを作成します。通常、このクラスは Spring Bean です。
public class MyEventPublisher {
private final ApplicationContext applicationContext;
public MyEventPublisher(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public void publishCustomEvent() {
MyCustomEvent event = new MyCustomEvent(/* 传递事件相关参数 */);
applicationContext.publishEvent(event);
}
}
- イベント リスナーの作成: 公開されたイベントを処理するために 1 つ以上のイベント リスナーを作成します。リスナーは ApplicationListener インターフェイスを実装し、リッスンするイベント タイプを指定します。
public class MyEventListener implements ApplicationListener<MyCustomEvent> {
@Override
public void onApplicationEvent(MyCustomEvent event) {
// 处理事件的逻辑
}
}
- イベント リスナーの作成: 公開されたイベントを処理するために 1 つ以上のイベント リスナーを作成します。リスナーは ApplicationListener インターフェイスを実装し、リッスンするイベント タイプを指定します。
<bean id="myEventListener" class="com.example.MyEventListener" />
- ApplicationContext を取得してイベントを公開する: ApplicationContext インスタンスを取得し、パブリッシャーを使用してカスタム イベントを公開します。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyEventPublisher eventPublisher = context.getBean(MyEventPublisher.class);
eventPublisher.publishCustomEvent();
上記の手順により、publishCustomEvent メソッドが呼び出されると、カスタム イベントが発行され、登録されたイベント リスナー (MyEventListener など) がイベントを受信して、対応するロジックを実行します。
Spring のイベント メカニズムはオブザーバー パターンに基づいた実装であり、コンポーネント間の通信を実現する疎結合の方法を提供し、それによってアプリケーションの分離とスケーラビリティを実現することに注意してください。同時に、イベント メカニズムを通じて、コンテナ全体のイベント処理を実装し、より柔軟でカスタマイズ可能なビジネス ロジックをアプリケーションに実装できます。