职责链模式 Chain of Responsibility :使多个对象都有机会处理请求,从而避免请求的发送者和接收之前的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
好处,接收者和发送者都没有对方的明确信息,且链中对象自己也并不知道链的结构,结果就是职责链可简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。
随时地增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。
//定义一个处理请示的接口
abstract public class Handler {
protected Handler successor;
//设置继任者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
//处理请求的抽象方法
public abstract void HandleRequest(int request);
}
public class ConcreteHandler1 extends Handler {
@Override
public void HandleRequest(int request) {
if (request >= 0 && request < 10) {
//0到10,这里处理
System.out.println(this.getClass().getName() + "处理请求" + request);
} else if (this.successor != null) {
this.successor.HandleRequest(request); //转移到下一位
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void HandleRequest(int request) {
if (request >= 10 && request < 20) {
//10到20,这里处理
System.out.println(this.getClass().getName() + "处理请求" + request);
} else if (this.successor != null) {
this.successor.HandleRequest(request); //转移到下一位
}
}
}
public class ConcreteHandler3 extends Handler {
@Override
public void HandleRequest(int request) {
if (request >= 20 && request < 30) {
//20到30,这里处理
System.out.println(this.getClass().getName() + "处理请求" + request);
} else if (this.successor != null) {
this.successor.HandleRequest(request); //转移到下一位
}
}
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
handler1.setSuccessor(handler2); //设置上下家
handler2.setSuccessor(handler3);
int[] Request = new int[]{
2, 5, 14, 22, 18, 3, 27, 20};
for (int num : Request) {
handler1.HandleRequest(num);
}
}
}
输出
day16chainofresponsibility.ConcreteHandler1处理请求2
day16chainofresponsibility.ConcreteHandler1处理请求5
day16chainofresponsibility.ConcreteHandler2处理请求14
day16chainofresponsibility.ConcreteHandler3处理请求22
day16chainofresponsibility.ConcreteHandler2处理请求18
day16chainofresponsibility.ConcreteHandler1处理请求3
day16chainofresponsibility.ConcreteHandler3处理请求27
day16chainofresponsibility.ConcreteHandler3处理请求20
Process finished with exit code 0