責任のパターンのチェーン
名前が示すように、要求の責任パターン(責任のパターンのチェーン)のチェーンは、レシーバオブジェクトのチェーンを作成します。 パターンのこのタイプの要求、送信者と要求減結合の受取人に与えられます。 デザインパターンのこのタイプは、行動パターンに属します。
このモードでは、各受信者は、通常、別の受信者への参照が含まれています。 オブジェクトは、要求を処理できない場合は、次の受信者に同じ要求をし、というように。
入門
意図:複数のオブジェクトは、要求を受信する可能性があるように、送信者と受信者を要求しないでくださいが一緒に結合され、これらのオブジェクトは、チェーンに接続され、オブジェクトはこれまでのところ、それを処理するまでチェーンに沿って要求を渡します。
リクエストの処理を担当プロセッサプロセッサのデューティチェーンは、顧客は、要求転送処理の詳細と要求注意を払う必要はありませんすることができ責任の連鎖に要求を送信する必要があるので、責任のチェーンと送信者の要求の要求:主なソリューションをデカップリング。
使用するとき:メッセージをフィルタリングするために、道路の多くを扱うとき。
修正方法:インターセプトクラスを統一されたインタフェースを実装します。
キーコード:重合自体の内部ハンドラ、HanleRequestで誰がセットに渡される前に条件がなく、アップダウン渡された場合、かどうかを判断するための適切な。
応用例:1、紅楼夢」はドラミング過ごすために渡します。」2、JSのイベントがバブリング。 3、処理のためのApache TomcatでのJava Webエンコーディング、Struts2のインターセプタ、JSPサーブレットのフィルター。
利点:1、結合を低減。これは、送信側と受信側の分離を要求します。 2、簡略化されたオブジェクト。 だからオブジェクトは鎖の構造を知っている必要はありません。 図3は、オブジェクト割り当てられた責任の柔軟性を向上させることができます。 チェーンのメンバーを変更したり、その順序を動員、動的な追加または削除責任を可能にすることによって。 4、新しいリクエストハンドラクラスを追加することは非常に便利です。
短所:1、要求が受信されなければならないことを保証することはできません。2、システムのパフォーマンスが影響を受けることになりますが、サイクル呼び出しを引き起こす可能性があるコードをデバッグ時に不便。 3は、容易に観察可能な特性ランタイム妨げるのデバッグではないかもしれません。
使用シナリオ:1、複数のオブジェクトが自動的に実行時間によって決定された要求を処理するためにどのオブジェクト具体的には、同じリクエストを処理することができます。2は、明示的にすることなく、複数のオブジェクトに要求を提出する受信者を指定します。 図3に示すように、オブジェクトのセットを動的に要求を処理するために割り当てることができます。
注:JAVAのWEBでの多くのアプリケーションで発生しました。
実現
私たちは、詳細なログレベルで、抽象クラスAbstractLoggerを作成します。 私たちは、その後、AbstractLoggerを拡張しているレコーダーの3種類を作成します。 それはそれに応じてプリントアウトされる場合は、各レベルのロガーメッセージは、自分のレベルかどうか、そうでない場合は、次のとレコーダーにメッセージを印刷されません。
ステップ1
抽象クラスのレコードを作成します。
AbstractLogger.java
パブリック抽象クラスAbstractLogger { パブリックstatic int型INFO = 1; パブリックstatic int型のDEBUG = 2; パブリックstatic int型ERROR = 3; 保護されたint型のレベル。 //次の要素で責任の連鎖がAbstractLogger nextLoggerを保護しました。 公共ボイドsetNextLogger(AbstractLogger nextLogger){ this.nextLogger = nextLogger。 } 公共ボイドLogMessageに(int型のレベル、文字列メッセージ){ {(this.level <=レベル)の場合 (メッセージ)を書きます。 } {(nextLogger!= null)の場合 nextLogger.logMessage(レベル、メッセージ)。 } } 抽象保護されたボイド書き込み(文字列メッセージ)。 }
ステップ2
レコードクラスを拡張するエンティティクラスを作成します。
ConsoleLogger.java
パブリッククラスConsoleLoggerはAbstractLoggerを{拡張します 公共ConsoleLogger(int型のレベル){ this.level =レベル。 } @Override 保護されたボイド書き込み(文字列メッセージ){ System.out.println( "標準コンソール::ロガー:" +メッセージ)。 } }
ErrorLogger.java
パブリッククラスErrorLoggerはAbstractLoggerを{拡張します 公共ErrorLogger(int型のレベル){ this.level =レベル。 } @Override 保護されたボイド書き込み(文字列メッセージ){ System.out.println( "エラーコンソール::ロガー:" +メッセージ)。 } }
FileLogger.java
パブリッククラスFileLoggerはAbstractLoggerを{拡張します 公共FileLogger(int型のレベル){ this.level =レベル。 } @Override 保護されたボイド書き込み(文字列メッセージ){ System.out.println( "ファイル::ロガー:" +メッセージ)。 } }
ステップ3
レコーダーの種類を作成します。 彼らにエラーの異なるレベルを与える、とレコーダーのそれぞれのレコードを設定します。 各ロガーレコーダー次の代表は、チェーンの一部です。
ChainPatternDemo.java
パブリッククラスChainPatternDemo { プライベート静的AbstractLoggerのgetChainOfLoggers(){ AbstractLogger errorLogger =新しいErrorLogger(AbstractLogger.ERROR)。 AbstractLogger fileLogger =新しいFileLogger(AbstractLogger.DEBUG)。 AbstractLogger consoleLogger =新しいConsoleLogger(AbstractLogger.INFO)。 errorLogger.setNextLogger(fileLogger)。 fileLogger.setNextLogger(consoleLogger)。 errorLoggerを返します。 } 公共の静的な無効メイン(文字列[] args){ AbstractLogger loggerChain = getChainOfLoggers(); loggerChain.logMessage(AbstractLogger.INFO、 「これが情報です。 "); loggerChain.logMessage(AbstractLogger.DEBUG、 「これは、デバッグレベルの情報です。 "); loggerChain.logMessage(AbstractLogger.ERROR、 「これは、エラー情報です。」)。 } }
ステップ4
出力を確認します。
標準コンソール::ロガー:これは情報です。 ファイル::ロガー:これはデバッグレベルの情報です。 標準コンソール::ロガー:これはデバッグレベルの情報です。 エラーコンソール::ロガー:これはエラー情報です。 ファイル::ロガー:これはエラー情報です。 標準コンソール::ロガー:これは、エラー情報です。