定義
デューティチェーンは、要求の送信者を避けるためであり、複数のオブジェクトが、チェーンを形成し、オブジェクトは、これまでそれを処理するまで、要求は鎖に沿って送信されるこれらのオブジェクトを接続するための要求を受信する可能性があるように、受信機は、互いに結合されています。
私たちは、いつの増加で、さらには、それらのシステムの柔軟性を高め、注文処理を変更することができる人、Chain of Responsibilityパターンでハンドラを変更することができます。柔軟性が治療によって増加するが、時にはそれはチェーンの端に配置され、処理することができませんどのような場合に要求につながる可能性があり、責任の連鎖は、利点と欠点の両方です。
役割
役割:
- ハンドラ:抽象ハンドラ。それは、要求を処理する方法を定義します。すべてのハンドラは、抽象クラスを実装する必要があります。
- ConcreteHandler:特定のハンドラ。これは、処理要求を担当するだけでなく、その後継者へのアクセスです。それは、要求を処理することができる場合は、それ以外の要求は、その後継者に渡されます。
- クライアント:クライアントクラス。
長所と短所
利点:
カップリングを減らします。これは、送信側と受信側のデカップリングを要求します。
簡体オブジェクト。このようなオブジェクトは鎖の構造を知る必要がないこと。
オブジェクトに責任を割り当ての柔軟性を向上させます。チェーンのメンバーまたはその順序の動員を変更することにより、動的に責任を追加または削除することができます。
簡単に要求を処理する新しいクラスを追加します。
短所
受信しなければならない要求は保証されません。
サイクル呼び出しを引き起こす可能性があり、システムのパフォーマンスが影響を受けますが、デバッグコードを実行するときに非常に便利ではないであろう。
それは容易に観察特性ランタイム妨げるのデバッグではないかもしれません。
例
学生は去ります
単独のオブジェクトを残します:
/**
* 请假单
*/
public class LeaveForm {
/** 请假天数 **/
private int number;
/** 请假人 **/
private String person;
public LeaveForm(String person,int number){
this.person = person;
this.number = number;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getPerson() {
return person;
}
public void setPerson(String person) {
this.person = person;
}
}
要約ハンドラ:
/**
* 抽象处理者
*/
public abstract class Leader {
/** 姓名 **/
public String name;
/** 后续处理者 **/
protected Leader successor;
public Leader(String name){
this.name = name;
}
public void setSuccessor(Leader successor) {
this.successor = successor;
}
public abstract void handleRequest(LeaveForm LeaveNode);
}
具体的な処理による:
/**
* 辅导员
*/
public class Instructor extends Leader {
public Instructor(String name) {
super(name);
}
@Override
public void handleRequest(LeaveForm LeaveNode) {
//小于3天辅导员审批,否则传递给系主任
if (LeaveNode.getNumber() <= 3) {
System.out.println("辅导员" + name + "审批" + LeaveNode.getPerson()
+ "同学的请假条,请假天数为"
+ LeaveNode.getNumber() + "天。");
} else {
if (this.successor != null) {
this.successor.handleRequest(LeaveNode);
}
}
}
}
/**
* 系主任
*/
public class DepartmentHead extends Leader {
public DepartmentHead(String name) {
super(name);
}
@Override
public void handleRequest(LeaveForm LeaveNode) {
//小于7天系主任审批,否则传递给院长
if (LeaveNode.getNumber() <= 7) {
System.out.println("系主任" + name + "审批" + LeaveNode.getPerson()
+ "同学的请假条,请假天数为" + LeaveNode.getNumber() + "天。");
} else {
if (this.successor != null) {
this.successor.handleRequest(LeaveNode);
}
}
}
}
/**
* 院长
*/
public class Dean extends Leader {
public Dean(String name) {
super(name);
}
@Override
public void handleRequest(LeaveForm LeaveNode) {
//小于10天院长审批,否则传递给校长
if (LeaveNode.getNumber() <= 10) {
System.out.println("院长" + name + "审批"
+ LeaveNode.getPerson() + "同学的请假条,请假天数为"
+ LeaveNode.getNumber() + "天。");
} else {
if (this.successor != null) {
this.successor.handleRequest(LeaveNode);
}
}
}
}
/**
* 校长
*/
public class President extends Leader {
public President(String name) {
super(name);
}
@Override
public void handleRequest(LeaveForm LeaveNode) {
//小于15天校长长审批,否则不允批准
if (LeaveNode.getNumber() <= 15) {
System.out.println("校长" + name + "审批"
+ LeaveNode.getPerson() + "同学的请假条,请假天数为"
+ LeaveNode.getNumber() + "天。");
} else {
System.out.println("请假天天超过15天,不批准...");
}
}
}
テスト:
public static void main(String[] args) {
Leader instructor = new Instructor("冯强"); //辅导员
Leader departmentHead = new DepartmentHead("冯晓强"); //系主任
Leader dean = new Dean("张妲强"); //院长
Leader president = new President("王望望"); //校长
instructor.setSuccessor(departmentHead); //辅导员的后续者是系主任
departmentHead.setSuccessor(dean); //系主任的后续者是院长
dean.setSuccessor(president); //院长的后续者是校长
//请假3天的请假条
LeaveForm leaveNode1 = new LeaveForm("张三", 3);
instructor.handleRequest(leaveNode1);
//请假9天的请假条
LeaveForm leaveNode2 = new LeaveForm("李四", 9);
instructor.handleRequest(leaveNode2);
//请假15天的请假条
LeaveForm leaveNode3 = new LeaveForm("王五", 15);
instructor.handleRequest(leaveNode3);
//请假20天的请假条
LeaveForm leaveNode4 = new LeaveForm("赵六", 20);
instructor.handleRequest(leaveNode4);
}
コンソール出力:
辅导员冯强审批张三同学的请假条,请假天数为3天。
院长张妲强审批李四同学的请假条,请假天数为9天。
校长王望望审批王五同学的请假条,请假天数为15天。
请假天天超过15天,不批准...