004行動-05-デューティ鎖(責任の鎖)

I.概要

  このリクエストオブジェクトのチェーンを作成するための要求を受信します

  このモデルは、一連のオブジェクトは、各クラスの異なる責任を取る密接に、これらのクラスのオブジェクト間リンクのチェーン、それが呼び出されたデューティチェーンと同じタスクを完了しているように構築しました。

  このモードでは、各受信機は、典型的には、別の受信者への参照を含みます。オブジェクトが要求を処理できない場合は、その次の受信者に同じ要求を渡す、となります。

1.1アプリケーションのシナリオ

  処理のうち一つ以上の連携処理は、オブジェクト要求を複数必要とします

   図1に示すように、同じオブジェクトの複数の要求、オブジェクトがランタイムによって自動的に決定された要求が処理されたコンクリートを処理することができます。

  図2に示すように、受信者が明示的に指定されていない場合には、複数のオブジェクトに要求を提出します。

  図3に示すように、オブジェクトのセットを動的に要求を処理するために割り当てることができます。

1.2、長所と短所

  利点:1、切り離します。これは、送信側と受信側のデカップリングを要求します。図2に示すように、オブジェクトが簡略化されます。このようなオブジェクトは鎖の構造を知る必要がないこと。図3に示すように、オブジェクトに責任を割り当てる柔軟性を高めます。チェーンのメンバーまたはその順序の動員を変更することにより、動的に責任を追加または削除することができます。4、簡単に新しいクラスリクエスト処理を追加します。

  短所:1、必ずしも要求が受信される保証はありません。デバッグコードを実行すると、サイクル呼び出しを引き起こす可能性がある場合は2、システムのパフォーマンスが非常に便利な影響がではなくなります。図3は、容易に観察可能な特性ランタイム妨げるデバッグではないかもしれません。

1.3、クラス図の役割と責任

  

  Chain of Responsibilityパターンの役割と責任

  1、抽象ハンドラ(ハンドラ)の役割:インタフェース処理要求を定義します。所望であれば、インターフェースはメソッドを設定するために定義され、家庭への参照を返すことができます。この役割は、通常のJava抽象クラスまたはJavaインターフェイスで構成されています。家に一定の関係ポリマーコンクリートサブクラス基準上ハンドラクラス図は、のhandleRequest抽象メソッド()動作仕様サブクラスは、要求を処理します。

  図2は、特定のハンドラ(ConcreteHandler)役割: 要求に応じて特定のプロセッサは、要求処理がオフに選択または家に要求することができます。必要に応じて、特定の治療は自宅でアクセスすることができ、それに起因特定のハンドラに、隣の家への参照を保持しています。

1.4進化

  抽象クラスを作成  AbstractLoggerを詳細なログレベルで、。我々は、我々は拡大しており、レコーダーの3種類を作成  AbstractLoggerを各レベルレコーダかどうか自分のレベルのメッセージ、およびプリントアウト対応する場合、そうでない場合は、印刷して、次の記録にメッセージを転送しないであろう。

抽象クラスのレコードを作成します。

パブリック 抽象 クラスAbstractLogger {
     パブリック 静的 int型 DEBUG = 1 公共の 静的な int型 INFO = 2 ;
    公共の 静的な int型 ERROR = 3 ; 

    保護された int型のレベル。

    // 责任链中的下一个元素
    保護AbstractLogger nextLogger。

    公共 ボイドsetNextLogger(AbstractLogger nextLogger){
         この .nextLogger = nextLogger。
    } 

    公共 ボイド LogMessageに(INTのレベル、文字列メッセージ){
         もしこの .level <= レベル){ 
            ライト(メッセージ)。
        } 
        であれば(nextLogger!= NULL ){ 
            nextLogger.logMessage(レベル、メッセージ)。
        } 
    } 

    抽象 保護 ボイドライト(文字列メッセージ)。

}

エンティティレコーダークラスを拡張するクラスを作成します。

コンソールロガー

パブリック クラス ConsoleLoggerは延びAbstractLogger { 

    公共 ConsoleLogger(INTのレベル){
         この .level = レベル。
    } 

    @Overrideは、
    保護された ボイド{ライト(文字メッセージ)
        のSystem.out.println( "標準コンソール::ロガー:" + メッセージ)。
    } 
}

ErrorLogger

パブリック クラス ErrorLoggerは延びAbstractLogger { 

    公共 ErrorLogger(INTのレベル){
         この .level = レベル。
    } 

    @Overrideは、
    保護された ボイド{ライト(文字メッセージ)
        のSystem.out.println( "エラーコンソール::ロガー:" + メッセージ)。
    } 
}

 FileLogger

パブリック クラス FileLoggerは延びAbstractLogger { 

    公共 FileLogger(INTのレベル){
         この .level = レベル。
    } 

    @Overrideは、
    保護された ボイド{ライト(文字メッセージ)
        のSystem.out.println( "ファイル::ロガー:" + メッセージ)。
    } 
}

レコーダーの種類を作成します。彼らは、異なるエラーレベルを付与し、各記録内の次のレコードを設定します。各レコードは、チェーンの一部を表す次のレコードです。

    プライベートAbstractLoggerのgetChainOfLoggers(){ 

        AbstractLogger errorLogger = 新しいErrorLogger(AbstractLogger.ERROR)。
        AbstractLogger fileLogger = 新しいFileLogger(AbstractLogger.INFO)。
        AbstractLogger consoleLogger = 新しいConsoleLogger(AbstractLogger.DEBUG)。

        errorLogger.setNextLogger(fileLogger)。
        fileLogger.setNextLogger(consoleLogger)。

        返すerrorLoggerを。
    }

テスト

    @Test
     公共 ボイドLogMessageに(){ 
        AbstractLogger loggerChain = getChainOfLoggers()。

        loggerChain.logMessage(AbstractLogger.DEBUG、
                 "これは、デバッグレベルの情報です。" ); 

        System.out.println( "----------" ); 
        loggerChain.logMessage(AbstractLogger.INFO、 "これは情報です。" )。

        System.out.println( "----------" ); 
        loggerChain.logMessage(AbstractLogger.ERROR、
                「これは、エラー情報です。」)。
    }

輸出

標準コンソール::ロガー:これは、デバッグレベルの情報です。
---------- 
ファイル::ロガー:これは情報です。
標準コンソール::ロガー:これは情報です。
---------- 
エラーコンソール::ロガー:これはエラー情報です。
ファイル::ロガー:これはエラー情報です。
標準コンソール::ロガー:これはエラー情報です。

第二に、拡張

適用例:プラグインインターセプタ、サーブレットフィルタ、ダボフィルタ、MyBatisのストラット

javax.servlet.Filter的のdoFilter、れるFilterChain

SpringSecurity

 

おすすめ

転載: www.cnblogs.com/bjlhx/p/11573667.html