責任の責任チェーンのデザインパターン(XV)チェーン

責任の連鎖定義された
責任の連鎖(COR)が要求クラス(クラス)、これらのクラスの間の疎結合の一連の要求を処理しようとしている、それらの間の唯一の共通分母は、要求を送信している。すなわち、です治療しなければ処理されていない上に渡されるチェーン(鎖)ように、それは、処理されたクラスCに渡された場合、要求、第一のプロセスカテゴリーは、それは、クラスBの処理に伝達されます。

使用する方法は?
このセクションでは、のCoRを使用する方法ですが、またのCoRが何であるかのデモが。

ハンドラインタフェースがあります:

パブリックインターフェースハンドラ{
  公共ボイドのhandleRequest();
}

このような印刷要求または要求のヘルプ要求フォーマットとして、複数の要求がある場合、これは、処理要求の場合である:

最初の溶液が考えられる:複数の要求は、インターフェイスに増加する:
パブリックインターフェースハンドラを{
  公共ボイドhandleHelp();
  空handlePrintパブリック();
  公共ボイドhandleFormat();

}

これは、インターフェースハンドラコードの特定の実装である:
パブリッククラスConcreteHandler実装ハンドラ{
  後継によってプライベートハンドラ。

  公共ConcreteHandler(ハンドラ後継){
  this.successor =後継。
}

  空handleHelpのパブリック(){
    //コードの特定の処理要求のヘルプ
    ...
  }

  空handlePrintのパブリック(){
    //プロセスがプリントに印刷転送する場合
    successor.handlePrint();
  }
  パブリック無効handleFormatを(){
    //それはフォーマット処理するフォーマットのターンであれば
    successor.handleFormatは();
  }

}
このような3つの特定の実装クラス、処理ヘルプの説明と同様に、これはおそらく、私たちの最も一般的なプログラミングのアイデアで処理印刷フォーマットを扱うがあります。

アイデアは単純ですが、拡張子の問題があるが、我々は、要求のタイプにリクエストを追加する必要がある場合、あなたはインタフェースとその実現のそれぞれを変更する必要があります。

2番目のプログラム:それぞれの要求は一つのインタフェースに変換されます、我々は次のコードを持っています:

パブリックインターフェイスHelpHandler {
  公共ボイドhandleHelp();
}

パブリックインターフェイスプリントハンドラ{
  公共ボイドhandlePrint();
}

パブリックインターフェイスFormatHandler {
  公共ボイドhandleFormat();
}

パブリッククラスConcreteHandlerは
  HelpHandler、プリントハンドラ、FormatHandlet {実装
  プライベートHelpHandler helpSuccessorを。
  プライベートプリントハンドラprintSuccessor。
  プライベートFormatHandler formatSuccessor。

  公共ConcreteHandler(HelpHandler helpSuccessor、プリントハンドラprintSuccessor、FormatHandler formatSuccessor)
  {
    this.helpSuccessor = helpSuccessor。
    this.printSuccessor = printSuccessor。
    this.formatSuccessor = formatSuccessor。
  }

  公共ボイドhandleHelp(){
    ......
  }

  公共ボイドhandlePrint(){this.printSuccessor = printSuccessor;}

  公共ボイドhandleFormat(){this.formatSuccessor = formatSuccessor;}

}

状況下で新しい要求の要求を追加するだけでなく、変更する必要がConcreteHandlerインタフェース、インタフェースの修正量を保存するには、このアプローチ。そして、コードは明らかにシンプルな美しさではありません。

溶液3:唯一つのパラメータハンドラインタフェースメソッドを使用して:
パブリックインターフェースハンドラ{
  公共ボイドのhandleRequest(要求文字列);
}
次のようにハンドラコードは:
パブリッククラスConcreteHandler実装ハンドラ{
  後継によってプライベートハンドラ。

  公共ConcreteHandler(ハンドラ後継){
    this.successor =後継。
  }

  {公共のhandleRequest(要求文字列)を無効
    (request.equalsは(「ヘルプ」)){IF
      //これは、ヘルプの具体的な処理のためのコードである
    他}
      //次に渡さ
      successor.handle(リクエスト)。

    }
  }

}

ここでは、どのように行うためにされていない場合、要求は、String型であると仮定しますか?もちろん、我々は特別なクラス・リクエストを作成することができます

最後の解決策:次のようにインターフェースハンドラコードがある:
パブリックインターフェースハンドラ{
  公共ボイドのhandleRequest(要求リクエスト);
}
定義Requestクラス:
パブリッククラスリクエスト{
  プライベート文字列型、

  パブリック要求(文字列型){タイプ= this.type;}

  パブリック文字列のgetType(){戻り型;}

  ボイド実行パブリック(){
    //要求アクションコード真特定
  }
}
次のようにハンドラコードがある:
パブリッククラスConcreteHandler実装ハンドラ{
  後継によってプライベートハンドラ。

  公共ConcreteHandler(ハンドラ後継){
    this.successor =後継。
  }

  公共のhandleRequest(要求Request)を無効{
    (要求のinstanceof HelpRequest){IF
      //これは、ヘルプの具体的な処理のためのコードである
    }他IF(要求のinstanceof PrintRequst){
      request.execute();
    }そうでなければ
      次に渡される//
      successor.handle (リクエスト)。

    }
  }

}

この溶液をCoRとは、鎖上に、対応するデューティクラス、いわゆる存在している責任の連鎖

CoR利点:
彼らは外の世界からの要求(クライアント)を予測することはできませんので、何それは限り、あなたが扱うことができるよう放棄する要求を満たすことができない場合は、各カテゴリに属するタイプ。

要求の完了は、もちろん、あなたはまた、ツリーの最適化の概念を使用することができ、完了するために、最後を通過することが可能であるので、不利な点は、効率が低いことです。JavaのAWT1.0では、マウスボタンの事を処理するためだけではなく、オブザーバーのCoRを使用しての、後でJava.1.1に、のCoRを使用することです

うわっ、統一されたインタフェースハンドラが存在しなければならないので。制限事項ここでは悪いスケーラビリティ、。

そして、コマンドモードの違い:

コマンドモードは、リクエスト中にカプセル化されるなど、移動表し、サーバが再び分解に達する前協議は、代表開始2として、クライアントとサーバの関係を呼び出す必要とします。

このモードは必要CoRとの事前の合意がない、サーバは、クライアントから要求されたのCoRモード、推測のテストを推測するために使用することができます。

ます。https://www.cnblogs.com/moiyer/archive/2011/08/08/2316175.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34413357/article/details/94693159