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