私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Chain of Responsibility パターンは、複数のオブジェクトがリクエストを順番に処理できるようにする動作設計パターンであり、各オブジェクトはリクエストを処理するか次のオブジェクトに渡すかを選択できます。このパターンでは、リクエストの送信者と受信者を分離することで、柔軟性とスケーラビリティが向上します。以下は、責任連鎖モデルの詳細な紹介です。
責任連鎖モデルの中核は、リクエスト チェーンとチェーンの終端の識別を設計することです。複数のリクエスト処理オブジェクトをチェーンに接続し、チェーン内のオブジェクトがリクエストの処理を決定するまで、リクエストがチェーン上を通過できるようにします。リクエストを行うクライアントは、チェーン内のどのオブジェクトが最終的にリクエストを処理するのかを知りません。そのため、システムはクライアントに影響を与えることなく動的に再編成し、責任を割り当てることができます。
クラス図:
責任連鎖モデルには主に次の役割が含まれます。
抽象ハンドラ (ハンドラ) : リクエストを処理するためのインターフェースを定義します。必要に応じて、インターフェイスは次のインターフェイスへの参照を設定して返すメソッドを定義できます。この役割は通常、抽象クラスまたはインターフェイスによって実装されます。
コンクリートハンドラー : リクエストを受信した後、特定のプロセッサはリクエストを処理するか、リクエストを次の当事者に渡すかを選択できます。具象プロセッサは次のホームへの参照を保持しているため、必要に応じて次のホームにアクセスできます。
クライアントクラス(クライアント): 処理チェーンを作成し、チェーン ヘッドの特定のプロセッサ オブジェクトにリクエストを送信します。
責任連鎖モデルは、次のシナリオに適しています。
複数のオブジェクトが共同してタスクを処理する: たとえば、複数レベルの承認システムでは、最終的な承認結果が得られるまで、承認者の権限とレベルに基づいて承認リクエストが次のレベルの承認者に渡されます。
動的結合処理の流れ: 責任チェーンを柔軟に構成することで、処理オブジェクトを動的に組み合わせてさまざまな処理プロセスを実装できます。
リクエストの送信者と受信者の直接結合を避ける: リクエストを責任チェーンに渡すことにより、リクエストの送信者は特定の処理オブジェクトを知る必要がなくなり、オブジェクト間の依存関係が軽減されます。
責任連鎖モデルは、以下を含むがこれらに限定されない多くの分野で広く使用されています。
以下は、責任連鎖パターンの簡単な実装例です。これは、ログ メッセージを処理し、ログ レベル (DEBUG、INFO、WARN、ERROR など) に応じてメッセージをさまざまなプロセッサに渡すために使用されます。
- // 抽象处理者
- abstract class LogHandler {
- protected int level;
- protected LogHandler nextHandler;
-
- public void setNextHandler(LogHandler nextHandler) {
- this.nextHandler = nextHandler;
- }
-
- //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
- public void logMessage(int level, String message) {
- if (this.level <= level) {
- write(message);
- }
- if (nextHandler != null) {
- nextHandler.logMessage(level, message);
- }
- }
-
- abstract protected void write(String message);
- }
-
- // 具体处理者:ErrorLogHandler
- class ErrorLogHandler extends LogHandler {
- public ErrorLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("ErrorLogHandler: " + message);
- }
- }
-
- // 具体处理者:WarnLogHandler
- class WarnLogHandler extends LogHandler {
- public WarnLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("WarnLogHandler: " + message);
- }
- }
-
- // 具体处理者:InfoLogHandler
- class InfoLogHandler extends LogHandler {
- public InfoLogHandler(int level) {
- this.level = level;
- }
-
- @Override
- protected void write(String message) {
- System.out.println("InfoLogHandler: " + message);
- }
- }
-
- // 客户端代码
- public class ChainPatternDemo {
- private static LogHandler getChainOfLoggers() {
- // 创建链中的处理者
- LogHandler errorLogHandler = new ErrorLogHandler(3);
-
- LogHandler warnLogHandler = new WarnLogHandler(2);
- warnLogHandler.setNextHandler(errorLogHandler);
-
- LogHandler infoLogHandler = new InfoLogHandler(1);
- infoLogHandler.setNextHandler(warnLogHandler);
-
- return infoLogHandler;
- }
-
- public static void main(String[] args) {
- LogHandler loggerChain = getChainOfLoggers();
-
- loggerChain.logMessage(1, "This is an informational message.");
- loggerChain.logMessage(2, "This is a warning message.");
- loggerChain.logMessage(3, "This is an error message.");
- }
- }
この例では、3 つの具体的なログ ハンドラー クラスを定義します (ErrorLogHandler
、WarnLogHandler
、InfoLogHandler
)、それぞれ異なるレベルのログ メッセージを処理します。各ハンドラーにはレベル (level
)、このレベルのメッセージを処理する必要があるかどうかを決定するために使用されます。電話することでlogMessage
メソッドでは、リクエストはチェーン内の最初のハンドラーに渡されます (infoLogHandler
)、独自のレベルと処理ロジックに基づいてメッセージを処理するかどうかを決定し、(処理されない場合は) チェーン内の次のプロセッサにリクエストを渡します。このプロセスは、チェーンの終わりまで、またはリクエストが処理されるまで継続します。
実際のアプリケーションでは、次のことが必要になる場合があることに注意してください。LogHandler
このクラスには、より複雑なログ処理ロジックと構成をサポートするためのメソッドとプロパティが追加されています。さらに、ログ レベルでは通常、列挙型が使用されます (enum
) を整数の代わりに使用して、コードの可読性と保守性を向上させます。
責任連鎖パターンは、リクエストを処理する複数のオブジェクトをチェーンに接続し、チェーン上のオブジェクトがリクエストの処理を決定するまでリクエストがチェーン上を通過できるようにすることで、リクエストの柔軟な処理とシステムのスケーラビリティを実現します。
責任連鎖モデルが役立つ場合は、忘れずに「いいね」を押して保存してください。