責任の責任パターンチェーンのチェーン
オブジェクト要求は、順次チェーンで送信要求を送信し、チェーンに接続された同じタイプを処理することができ、それが要求されたオブジェクトを処理する能力に伝達されるまで、それはチェーンをダウン渡すことができません
シーン:
- トランプ
- 承認のための奨学金
- 休暇の承認
コア:それはクライアントに連鎖され、配列は、構成ファイルまたはの存在によってロードすることができます。
一般的なシナリオを開発します:
- キャッチ異常なチェーンを試してみてください
-javascript言語、Java言語の泡立ちやイベント捕捉機構、Observerパターンを使用してイベントハンドラ
-Servlet開発、フィルタチェーン
-Struts2、コール・インターセプターは、チェーン化の典型的なものです
例:作業休暇
承認のための承認0-3 3-10 10-30ゼネラルマネージャーのためのディレクターの承認マネージャ
/ **
*休暇のために書かれた要求
*の@authorの帆がコードをノック
*
* /
*休暇のために書かれた要求
*の@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 =理由。
}
}
プライベート文字列の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);
}
保護された文字列leaderNameは、
リーダーnextLeader保護; //後継責任鎖オブジェクト
パブリックリーダー(文字列leaderName)は{
this.leaderName = leaderName;
}
//に配置された行送り
公共ボイドsetNetLeader(リーダーリーダー){
リーダー= this.nextLeader;
}
//処理休暇申請のためのビジネスメソッド
パブリック抽象ボイドハンドラ(leaveRequest leaveRequest);
}
パブリッククラスDirectorは、{リーダーを拡張します
公共ディレクター(文字列leaderName){
スーパー(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は( "このスタッフを終了することをお勧めします");
}
}
}
公共ボイドハンドラ(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)。
}
スーパー(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は( "このスタッフを終了することをお勧めします");
}
}
}
公共ボイドハンドラ(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)。
}
スーパー(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は( "このスタッフを終了することをお勧めします");
}
}
}
公共ボイドハンドラ(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);
}
リーダー新しい新ディレクター=(「ジョン・ドウ」);
リーダーB =新しい新しいマネージャー(「ジョン・ドウ」);
リーダーは、ゼネラルマネージャーの新しい新しいC =(「王ウー」)を含む;
//スタート責任組織の鎖
a.setNetLeader(B);
b.setNetLeader(C);
LeaveRequest REQl新しい新しいLeaveRequest =( "TOM"、2 "JACK把持");
a.handler(REQl);
}
}