Javaのデザインパターンは、Chain of Responsibilityパターンを説明します

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/LZHH_2008/article/details/93967841

Chain of Responsibilityパターンは、行動の一般的なパターンです。

責任パターンの現実場面チェーン

西魏の誕生日のKTVは喜びの雰囲気を高めるために、一緒に祝うために多くの友人を招待し、西魏は、私はあなたがゲームの花のドラムパスを果たしていることを示唆しています。手が歌を飲んで、歌っなければならないだろう過ごした西魏、ドラムが停止したときに順番に、ダウン過ごすために渡し、によってドラミング。 
我々はすぐにパーティーの雰囲気を盛り上げるために、このゲームに参加するために非常に熱心であり、西魏はまた、非常に幸せな誕生日パーティーを持っていました。

上記のシナリオでは、ゲームの花のドラムパスは、Chain of Responsibilityパターンのデザインモードに似て、イベントは、イベントが実行されるまで、渡されるし続けることです。

II。責任パターンの定義チェーン(Respinsibilityパターンのチェーン)の


オブジェクトの複数それにより、要求の送信者と受信者との間の結合を回避し、要求を処理する機会。これらのオブジェクトは、オブジェクトがこれまでにそれを処理するまで、順次チェーンに沿って要求を渡し、チェーンをつなぎ合わせ。

 

IV。2文字のChain of Responsibilityパターン
1.要約ハンドラ(ハンドラ)の役割
抽象文字要求のは、設定および方法を定義して、次のハンドラへの参照を返すことができます。

2.特定のハンドラ(Concrteハンドラ)の文字は、
リクエストに文字の後に、要求はを処分することを選択するか、次のハンドラに要求を渡すことがあります。 
必要に応じて、特定の治療法は、その次に、ハンドラの問題を次のハンドラにアクセスし、できる場合により、特定のハンドラに、それゆえ、次のハンドラの参照を保持します。

長所と短所の責任パターンのV.チェーン
Chain of Responsibilityパターンの利点は
責任パターン要求とを別々に対処1.チェーン、依頼者は、処理要求者が全体像を知ることができない、処理している人を知っていません。
2.システムの改良された柔軟性を
コマンドモードの欠点
1は、性能を低下させます。各要求は、長鎖に直面したとき、パフォーマンスが低下する最初のチェーンにチェーンの端から横断されます。
モデルは同様の再帰的を使用しているため、デバッグが容易な2は、ロジックをデバッグするときには、より複雑です。
責任のチェーン内のノードの数がノードの最大数を設定する必要があり、非常に長いチェーンの事態を回避するように制御する必要があり、複数回が意図せずに、システムのパフォーマンスの責任の連鎖を壊す避けるためにノードを追加することはできません。

VI。責任パターンの使用シナリオのチェーン
サーブレットフィルタFilterDispatcher責任のパターンのチェーンは、共通パターンである、Struts2のコア制御、制御モードが責任の連鎖を使用することで、ユーザは、濾過プロセスの層を要求することができます。実際のプロジェクトで使用責任パターンの鎖は、以下のように、典型的なアプリケーションシナリオが、存在します。

1.リクエストは、一連の処理を必要とします。
そのような文書の承認など2.ビジネスプロセスフロー、。
3.システムを展開します。
VII。責任のパターンのチェーンの例
サンプルコードの花のドラム転送、敗者は飲みます

 

抽象クラスのプレーヤー

パッケージcom.chain.test。

パブリック抽象クラスプレイヤー{

    //特定の事柄人
    のプライベートプレーヤーdirnk。

    公共プレーヤーgetDirnk(){
        戻りdirnk。
    }

    特定渡す人の//次のロット
    (プレーヤーdirnk)公共ボイドsetDirnkを{
        this.dirnk = dirnk;
    }
    
    //拡散処理
    パブリック抽象ボイドハンドル(私はint型);
    
    ます。public void次の(int型のインデックス){
        IF( !dirnk = NULL){
            dirnk.handle(インデックス);
        }他{
            System.out.printlnは() "ゲームオーバー!";
        }
    }
}

 

クラス固有の処理PlayerA

パッケージcom.chain.test。

/ **
 *ゲーム参加者
 * @authorのPC
 *
 * /
publicクラスPlayerA拡張プレーヤー{
    
    //コンストラクタ渡して次のゲーム参加者
    のパブリックPlayerA(プレイヤーはドリンク){
        this.setDirnk(ドリンク);
    }

    //游戏过程
    @Override
    ます。public voidハンドル(I int型){
        
        (I%5 == 1){場合
            のSystem.out.println( "PlayerAは飲みます!");
        }他{
            System.out.printlnは( "次PlayerA!");
            次の(I);
        }

    }

}

クラス固有の処理PlayerB

パッケージcom.chain.test。

/ **
 *ゲーム参加者
 * @authorのPC
 *
 * /
publicクラスプレイヤー{PlayerBを拡張

    //コンストラクタ渡して次のゲーム参加者
    のパブリックPlayerB(プレーヤードリンク){
        this.setDirnk(ドリンク);
    }
    
    //ゲーム
    @Override
    ます。public voidハンドル(INT I){
        
        IF(Iの== 2 5%){
            System.out.println( "PlayerBはドリンク!");
        }他{
            System.out.printlnは( "PlayerB次!");
            次の(I);
        }

    }

}
 

クラス固有の処理PlayerC

パッケージcom.chain.test。

パブリッククラスPlayerCはプレイヤーを{拡張します

    //渡すコンストラクタ次のゲーム参加者
    のパブリックPlayerC(プレーヤードリンク){
        this.setDirnk(ドリンク);
    }
    
    //ゲーム
    @Override
    ます。public voidハンドル(INT I){
        
        IF(I == 3. 5%){
            System.out.println( "PlayerCはドリンク!");
        }他{
            System.out.printlnは( "PlayerC次!");
            次の(I);
        }

    }

}
 

クラス固有の処理PlayerD

パッケージcom.chain.test。

パブリッククラスPlayerDはプレイヤーを{拡張します

    //コンストラクタ渡して次のゲーム参加者
    のパブリックPlayerD(プレーヤードリンク){
        this.setDirnk(ドリンク);
    }
    
    //ゲーム
    @Override
    ます。public voidハンドル(INT I){
        
        IF(I == 4. 5%){
            System.out.println( "PlayerDはドリンク!");
        }他{
            System.out.printlnは( "PlayerD次!");
            次の(I);
        }

    }

}
 

クラス固有の処理PlayerE

パッケージcom.chain.test。

パブリッククラスPlayerEはプレイヤーを{拡張します

    //次のゲーム参加者渡すコンストラクタ
    公共PlayerE(プレーヤードリンク){
        this.setDirnk(ドリンク);
    }
    
    //ゲーム
    @Override
    ます。public voidハンドル(INT I){
        
        IF(Iの== 0.5%)の{
            System.out.println( "PlayerEはドリンク!");
        }他{
            System.out.printlnは( "PlayerE次!");
            次の(I);
        }

    }

}
 

テストカテゴリ:

パッケージcom.chain.test。

/ **
 *テスト
 * @author PC
 *
 * /
publicクラスTestChain {

     公共の静的な無効メイン(文字列引数[]){
            //创建一个链
            PlayerA playerA = NULL;
            PlayerE playerE =新しいPlayerE(playerA)。
            PlayerD playerD =新しいPlayerD(playerE)。
            PlayerC playerC =新しいPlayerC(playerD)。
            PlayerB playerB =新しいPlayerB(playerC)。
            // PlayerA playerA =新しいPlayerA(playerB)。
            playerA =新しいPlayerA(playerB)。
            //击鼓下停下来
            playerA.handle(5)。
        }
}

結果:

次PlayerA!
PlayerB次回!
次PlayerC!
PlayerD次回!
PlayerEは飲みます!

 

しかし、の現実のゲームは、(i%N == 0)が実現できれば、各クラスの変換を必要とする一般的な循環を、渡します

オリジナルます。https://blog.csdn.net/wenzhi20102321/article/details/79333899 
 

おすすめ

転載: blog.csdn.net/LZHH_2008/article/details/93967841