Chain of Responsibilityパターンを使用して研究最近見つけネッティーでは、書き込みの書き込みコードの多くは、Chain of Responsibilityパターンについて学ぶことを決めたならば...自分の状況が他に遭遇した組み合わせ。
シナリオは、Chain of Responsibilityパターンを選ぶだろう何の下A.
私たちのビジネス・ロジックの間に、必要性は、これは確かにある場合には、渡されたパラメータの比較的少数の種類は、やっている場合...他に決定することができた場合、渡されたパラメータの異なる種類に応じて異ならせることにします問題ありませんが、しかし、業務システムの拡大に後者によるものは、拡張されたパラメータの型に結果が治療のように多くの異なる種類に従います場合は、リファクタリングを表現するためにChain of Responsibilityパターンを使用する必要があり、これはコードより良いパッケージを行います後者は新しい処理シナリオを追加した場合、より簡潔には、より強力な読書、のみ元のコードに有意な変化は存在しません、行に新しいカテゴリを追加する必要があります。
あなたがいることを扱うことができない場合は、着信パラメータの型は、それが最初のハンドラによって処理され、ハンドラ・プロセスの定義を満たしている場合、同じメソッド呼び出しを行うための再帰呼び出しのような責任のパターンの使用チェーンは、逆方向に渡しますそれは、処理のために、後続のハンドラに引き渡されます。
もし...他の書き込みは、問題の多くは解決しますが、個人的に多くの書き込みを考えて、そのようかのように...他に、壁のように、処理するためのさまざまな方法を選択するために、異なる要求タイプで待っている、と責任することができます一点鎖線は、ハンドラ以降の処理で処理することができない、現在のプロセスで処理することができ、処理モードと同じです。
責任のパターンのチェーンのII。製造
1.要約ハンドラ1合計
ハンドラを実装する2.書き込み3つの実装クラス
3.要求クラス
4.クライアントテストクラス
/ ** *ハンドリングロボットが要求 * * @author pengbo.zhao 5月7日の* @data 2019インディアン12日の午後1時51分17秒 * / パブリック 抽象 クラスハンドラ{ 公共の 最終的な 静的 ;文字列REQUEST_TYPE_ORDER =「注文」 // 注文処理を 公共の 最終的な 静的な文字列REQUEST_TYPE_HOT =「ホット」; //は、ハンドル尋ねるホットスポット 公衆 決勝 静的文字列REQUEST_TYPE_HIS =「Hisタグを」; // 履歴ハンドル プライベートタイプの文字列; プライベートハンドラnetxtHandler; 公共ハンドラ(String型の){ この .TYPE = タイプ; } 公共 決勝 無効HandlerChainに(リクエストリクエスト){ IF(request.getName()に等しい(。この.TYPE)){ この.handler(リクエスト); } 他{ IF(この .netxtHandler =!ヌル){ この.netxtHandler。HandlerChainに(要求);このメソッドの実装に//再帰呼び出しハンドラクラス } 他{ // サービスに応じて、さらに処理を行う必要があり 、他の処理のニーズが行われるのSystem.out.println(」.. .... "); } } } パブリック ボイドnextHandler(ハンドラハンドラ){//次の処理ハンドラを設定し 、この .netxtHandler = ハンドラ; } 保護 抽象 ボイドハンドラ(要求リクエスト); //実装クラスオーバーライド }
インポートjava.util.Map.Entry; / ** *注文処理 * * @author pengbo.zhao 5月7日の* @data 2019インディアン12日の午後2時13分48秒 * / パブリック クラス OrderHandler 拡張ハンドラ{ 公共のString型のOrderHandlerを( ){//サブクラスは親クラス、ロードはサブクラスを作るために完了した後の最初の親クラスローダは、ここに負荷に渡されたときに、サブクラスがパラメータに渡されるときの負荷特性に、一度に仮想マシンを親クラスを継承しています親は、親クラスが最初のサブクラスをロードする前にロードされ、またはスーパークラスが完全にロードすることができないので、 スーパー(Handler.REQUEST_TYPE_ORDER); } @Overrideは、 保護された ボイドハンドラ(要求リクエスト){ System.err.println(「OrderHandlerを.. ......... " ); のための(エントリ<文字列、文字列>エントリ:request.getParamterMap()のentrySet()){ するSystem.out.println( "キー= "+ entry.getKey()+"マッピング=" + entry.getValue())。 } } }
パブリック クラス HisHandlerは延びハンドラ{ 公共HisHandler(文字列型){ スーパー;(Handler.REQUEST_TYPE_HIS)を } @Overrideは、 保護された ボイドハンドラ(要求リクエスト){ System.err.println( "HisHandlerを..........." )。 用(エントリ<文字列、文字列> 。エントリー:request.getParamterMap()のentrySet()){ するSystem.out.println( "キー= "+ entry.getKey()+"マッピング=" + entry.getValue())。 } } }
パブリック クラス HotHandlerは延びハンドラ{ 公共HotHandler(文字列型){ スーパー(Handler.REQUEST_TYPE_HOT)を、 } @Overrideは、 保護された ボイドハンドラ(要求リクエスト){ System.err.println( "HotHandlerを..........." )。 用(エントリ<文字列、文字列> 。エントリー:request.getParamterMap()のentrySet()){ するSystem.out.println( "キー= "+ entry.getKey()+"値=" + entry.getValue())。 } } }
要求クラス
パブリック クラス要求{ パブリック要求(文字列名、地図<文字列、文字列> paramterMap){ この .nameの= 名前。 この .paramterMap = paramterMap。 } プライベート文字列名; プライベート地図<文字列、文字列> paramterMap。 パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } パブリックマップ<文字列、文字列> getParamterMap(){ リターンparamterMap; } 公共 ボイド setParamterMap(MAP <文字列、文字列> paramterMap){ この .paramterMap = paramterMap。 } }
テストカテゴリ
パブリック クラスのテスト{ 公共 静的 ボイドメイン(文字列[]引数){ 文字列型[] = {「順序」、「暑い」、「彼の」}。 地図 <文字列、文字列> paramMap = 新しい HashMapの<> (); paramMap.put( "key_1"、 "_1" ); paramMap.put( "key_2"、 "VALUE_2" ); 要求リクエスト = 新しい要求(タイプ[ 新しいランダム()nextInt(3 )]、paramMap)。 OrderHandler(Handler.REQUEST_TYPE_ORDERを)。 ハンドラhotHandler = HotHandler(Handler.REQUEST_TYPE_HOT)。 ハンドラhishandler = 新しいHisHandler(Handler.REQUEST_TYPE_HIS)。 orderHandler.nextHandler(hotHandler)。 hotHandler.nextHandler(hishandler)。 orderHandler.handlerChain(リクエスト)。 } }