責任パターンのデザインパターンのGOF23チェーン

責任の責任パターンチェーンのチェーン

オブジェクト要求は、順次チェーンで送信要求を送信し、チェーンに接続された同じタイプを処理することができ、それが要求されたオブジェクトを処理する能力に伝達されるまで、それはチェーンをダウン渡すことができません

シーン:

- トランプ

- 承認のための奨学金

- 休暇の承認

コア:それはクライアントに連鎖され、配列は、構成ファイルまたはの存在によってロードすることができます。

一般的なシナリオを開発します:

- キャッチ異常なチェーンを試してみてください

-javascript言語、Java言語の泡立ちやイベント捕捉機構、Observerパターンを使用してイベントハンドラ

-Servlet開発、フィルタチェーン

-Struts2、コール・インターセプターは、チェーン化の典型的なものです

:作業休暇

承認のための承認0-3 3-10 10-30ゼネラルマネージャーのためのディレクターの承認マネージャ

/ **
 *休暇のために書かれた要求
 *の@authorの帆がコードをノック
 *
 * /
パブリッククラスLeaveRequest {
   プライベート文字列のempName。
   プライベートint型leaveDays。
   プライベート文字列理由。
   パブリック文字列getEmpName(){
    のempNameを返します。
   }
   公共ボイドsetEmpName(文字列のempName){
    this.empName =のempName。
   }
   公共INT getLeaveDays(){
    戻りleaveDays。
   }
   公共ボイドsetLeaveDays(INT leaveDays){
    this.leaveDays = leaveDays。
   }
   パブリック文字列getReason(){
    返品理由。
   }
   公共ボイドsetReason(文字列理由){
    this.reason =理由。
   }
   公共LeaveRequest(文字列のempNameは、leaveDays、文字列理由INT){
    this.empName =のempName。
    this.leaveDays = leaveDays。
    this.reason =理由。
   }
}
パブリック 抽象 クラスリーダー{
  保護された文字列leaderNameは、
  リーダーnextLeader保護; //後継責任鎖オブジェクト
  パブリックリーダー(文字列leaderName)は{
   this.leaderName = leaderName;
  }
  //に配置された行送り
  公共ボイドsetNetLeader(リーダーリーダー){
   リーダー= this.nextLeader;
  }
   //処理休暇申請のためのビジネスメソッド
  パブリック抽象ボイドハンドラ(leaveRequest leaveRequest);
}
パブリッククラスDirectorは、{リーダーを拡張します
 公共ディレクター(文字列leaderName){
  スーパー(leaderName)。
 }
 @Override
 公共ボイドハンドラ(LeaveRequest leaveRequest){
     IF( leaveRequest.getLeaveDays()<3){
     するSystem.out.println( "従業員:" + leaveRequest.getEmpName()+ "残す:" + leaveRequest.getLeaveDays()+ "理由:" + leaveRequest.getReason());
     System.out.printlnは( "監督:" "!、承認" + this.leaderName +);
    }他{
     IF(this.nextLeader = NULL){!
      nextLeader。ハンドラ(leaveRequest);
     }他{
      System.out.printlnは( "このスタッフを終了することをお勧めします");
     }
    }
 }
}
パブリッククラスマネージャは、{リーダーを拡張します
 公共マネージャー(文字列leaderName){
  スーパー(leaderName)。
 }
 @Override
 公共ボイドハンドラ(LeaveRequest leaveRequest){
    IF(leaveRequest.getLeaveDays()<10){
     するSystem.out.println( "従業員:" + leaveRequest.getEmpName()+ "残す:" + leaveRequest.getLeaveDays()+ "理由:" + leaveRequest.getReason());
     のSystem.out.println( "管理者:" + this.leaderName + "!、承認");
    }他{
     IF(this.nextLeader = NULL){!
      nextLeader。ハンドラ(leaveRequest);
     }他{
      System.out.printlnは( "このスタッフを終了することをお勧めします");
     }
    }
 }
}
パブリッククラスゼネラルマネージャーは、{リーダーを拡張します
 公共ゼネラルマネージャー(文字列leaderName){
  スーパー(leaderName)。
 }
 @Override
 公共ボイドハンドラ(LeaveRequest leaveRequest){
    IF(leaveRequest.getLeaveDays()<30){
     するSystem.out.println( "従業員:" + leaveRequest.getEmpName()+ "残す:" + leaveRequest.getLeaveDays()+ "理由:" + leaveRequest.getReason());
     のSystem.out.println( "ゼネラルマネージャー:" "!、承認" + this.leaderName +);
    }他{
     IF(this.nextLeader = NULL){!
      nextLeader .handler(leaveRequest);
     }他{
      System.out.printlnは( "このスタッフを終了することをお勧めします");
     }
    }
 }
}
パブリッククラスクライアント{
 静的な無効メインパブリック(文字列[] args)を{
   リーダー新しい新ディレクター=(「ジョン・ドウ」);
   リーダーB =新しい新しいマネージャー(「ジョン・ドウ」);
   リーダーは、ゼネラルマネージャーの新しい新しいC =(「王ウー」)を含む;
   
    //スタート責任組織の鎖
   a.setNetLeader(B);
   b.setNetLeader(C);
   
   LeaveRequest REQl新しい新しいLeaveRequest =( "TOM"、2 "JACK把持");
   a.handler(REQl);
 }
}

おすすめ

転載: www.cnblogs.com/code-fun/p/11357189.html