定義:複数のオブジェクトがリクエストを処理する機会を持つことができるため、送信者とリクエストのレシーバーとの間の結合関係を回避できます。これらのオブジェクトをチェーンに接続し、オブジェクトが処理するまでチェーンに沿ってリクエストを渡します。
タイプ:行動パターン
クラス図:
まずコードを見てみましょう。
public void Test(int i、request request){if(i == 1){handler1.response(request); } else if(i == 2){handler2.response(request); } else if(i == 3){handler3.Response(request); } else if(i == 4){handler4.response(request); } else {handler5.Response(request); }}コードのビジネスロジックは次のとおりです。メソッドには、整数Iとリクエストリクエストの2つのパラメーターがあります。リクエストを処理するIの値に応じて、i == 1の場合、Handler1によって処理され、i == 2の場合、Handler2によって処理されます。プログラミングでは、この種のビジネス処理方法が非常に一般的です。リクエストを処理するすべてのクラスには、ifが含まれます。私は誰もがそれをよく使うと信じています。この方法の利点は、非常に直感的で、シンプルで明確で、メンテナンスが比較的簡単であることですが、この方法にはいくつかの頭痛もあります。
コードの肥大化:実際のアプリケーションでは、判断条件は通常、1か2か2かどうかを判断するのはそれほど簡単ではありません。複雑な計算が必要になる場合があります。データベースなどを照会する可能性があります。これには追加のコードがあります。多くの判断条件がある場合、これは...他の...声明が基本的に読むことは不可能です。
高い結合度:プロセス要求のクラスを追加し続けたい場合は、判断条件の場合は他のものを追加し続ける必要があります。さらに、この状態の順序も死者に書かれています。注文を変更したい場合は、この条件ステートメントのみを変更できます。
私たちはすでに欠点を理解しているので、それらを解決する方法を見つける必要があります。このシナリオのビジネスロジックは非常に単純です。条件1が満たされている場合、Handler1によって処理され、満たされていない場合、受け継がれます。条件2が満たされている場合、それはHandler2によって処理され、満たされていない場合、条件が終了するまで渡されます。実際、改善方法も非常に単純です。これは、判断条件の一部を処理クラスに入れることです。これが責任接続モデルの原則です。
責任会社モデルの構造
責任接続パターンのクラス図は非常に単純で、抽象的に処理されたクラスとその一連の実装クラスで構成されています。
抽象処理クラス:抽象処理クラスには、主に次の処理クラスを指すメンバー変数Nexthandlerと、リクエストを処理するメソッドハンドレクエストが含まれます。ハンドレクエスト方法の主な考え方は、処理条件が満たされている場合、この処理クラスが処理されるということです。
特定の処理クラス:特定の処理クラスは、主に特定の処理ロジックと処理に適用可能な条件を実装します。
例
責任チェーンモデルには2つの役割があります。
抽象ハンドラーの役割:要求されたインターフェイスを定義します。必要に応じて、次のホームオブジェクトへの参照を設定して返す方法を定義できます。
ConcreteHandlerの役割:処理できる場合は、リクエストを処理します。処理できない場合は、リクエストを次の家に渡し、次の家にそれを処理させます。つまり、処理できるリクエストを処理し、次の家にアクセスできます。
上記のパターンのテストコードは次のとおりです。
Package ChainofResp;/***説明:抽象処理ロール*/public Abstractクラスハンドラー{保護されたハンドラー後継者; / ***説明:処理方法*/ public Abstract void HandlerRequest(String条件); Public Handler getSuccessor(){return chucker; } public void setsuccessor(ハンドラー後継者){this.successor =後継者; }} Package ChainofResp;/***説明:役割の詳細*/public Class ConcreteHandler1拡張ハンドラー{@Override public void handlerRequest(string条件){//自分の責任の場合、あなたはそれを処理し、次の家にそれを渡す責任があります戻る ; } else {system.out.println( "concretehandler1 pass"); getSuccessor()。ハンドラーリクエスト(条件); }}} Package ChainofResp;/***説明:役割の詳細*/public Class ConcreteHandler2拡張ハンドラー{@Override public void handlerRequest(string condition){//自分の責任の場合、あなたはそれを処理し、次の家に渡す責任があります戻る ; } else {system.out.println( "concretehandler2 pass"); getSuccessor()。ハンドラーリクエスト(条件); }}} Package ChainOfResp;/***説明:詳細な処理ロール*/パブリッククラスのConcreteHandlern拡張ハンドラー{/***ここでは、nは実際の状況で処理する必要があるチェーンの最後のノードであると想定されます。 * */ @Override public void handlerRequest(string condition){system.out.println( "concretehandlern handled"); }} Package ChainofResp;/***説明:テストクラス*/public class client {/***説明:*/public static void main(string [] args){handler handler1 = new ConcreteHandler1(); Handler Handler2 = new ConcreteHandler2();ハンドラーハンドラー= new ConcreteHandlern(); // Chain Handler1.Setsuccessor(Handler2); Handler2.Setsuccessor(Handlern); //この要求がconcretehandler2 handler1.handlerRequest( "concretehandler2")の責任であると仮定します。 }}
この例を挙げると、おもちゃの工場の制作ワークショップでは、組立ラインは責任の連鎖です。おもちゃの航空機にシェルアセンブラー、エンジンアセンブラー、プロペラアセンブラー、モデルパッカーがある場合。航空機がオブジェクトが流れる人に流れると、彼は責任を負う部品を設置する責任があります。この部品がインストールされると、次のステップに流れ込み、すべての環境が完了したことがわかります。これは生成される責任の連鎖です。また、品質検査チェーンもあり、複数の部品、シェル検査、エンジン検査、プロペラ検査、包装検査に分かれています。製品が責任を負っている作品をテストするために製品を検査官に任せた場合、問題がある場合は直接取り出されます。問題がない場合は、すべてのテストが完了するまで次の検査官に渡されます。これら2つは責任のチェーンですが、違いは、誰もが責任の連鎖を処理し、その一部を処理することです。判断後、品質検査に対する責任の連鎖は処理されるか、処理されません。これらは、責任チェーンの2つのカテゴリです。後者は純粋な責任チェーンと呼ばれ、前者は不純な責任チェーンと呼ばれます。純粋な責任チェーンは、実際のアプリケーションにはめったに存在しません。一般的なものは不純な責任チェーンです。上記のモデルは、処理する純粋な責任チェーンをシミュレートします。
責任チェーンモデルの長所と短所
IFと比較して…責任チェーンパターンは、条件付き判断をさまざまな処理クラスに分配するため、カップリング能力が低くなり、これらの処理クラスの優先処理順序を自由に設定できます。責任チェーンモデルには欠点もあります。これは、if ... else ...ステートメント、つまり、正しい処理クラスを見つける前に、すべての判断条件を実行する必要があります。責任チェーンが比較的長い場合、パフォーマンスの問題はより深刻です。
責任チェーンモデルに適用されるシナリオ
最初の例と同じように、if…else…statementの責任を整理するためのステートメントを使用するときに圧倒された場合、コードは悪く見えます。
要約します
責任チェーンモデルは、実際には... else ...ステートメントの柔軟なバージョンです。これらの判断条件を各処理クラスに入れます。これの利点は、より柔軟性があることですが、リスクももたらします。たとえば、処理クラスの前後に処理クラス間の関係を設定する場合、処理クラスの前後に条件付きロジック間の関係を判断し、チェーンに循環参照がないように注意する必要があります。