职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的藕合关系。
将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
1.当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
2.接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简
化对象的相互连接,它们仅需保持一个指向其后续者的引用,而不需保持它所有的候选接受者的引用。
3.可随时地增加或修改处理一个请求的结构。增加了给对象指派职责的灵活性。
4.需事先考虑全面,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。
/** * Handler类,定义一个处理请求的接口 */ public abstract class Handler { protected Handler successor; // 设置继任者 public void setSuccessor(Handler successor){ this.successor = successor; } // 处理请求的抽象方法 public abstract void handleRequest(int request); }
/** * 具体处理者类:当请求数在0到10之间则有权处理,否则转到下一位。 */ public class ConcreteHandler1 extends Handler{ @Override public void handleRequest(int request) { if(request>=0 && request<10){ System.out.println("ConcreteHandler1 处理请求数"+request ); }else if(successor!=null){ // 转到下一位 successor.handleRequest(request); } } }
/** * 具体处理者类:当请求数在10到20之间则有权处理,否则转到下一位。 */ public class ConcreteHandler2 extends Handler{ @Override public void handleRequest(int request) { if(request>=10 && request<20){ System.out.println("ConcreteHandler2 处理请求数"+request ); }else if(successor!=null){ // 转到下一位 successor.handleRequest(request); } } }
/** * 具体处理者类:当请求数在20到30之间则有权处理,否则转到下一位。 */ public class ConcreteHandler3 extends Handler{ @Override public void handleRequest(int request) { if(request>=20 && request<30){ System.out.println("ConcreteHandler3 处理请求数"+request ); }else if(successor!=null){ // 转到下一位 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 = {2,5,14,22,18,3,27,20}; for(int i : request){ // 循环给最小处理者提交请求,不同的数额,由不同权限处理者处理 handler1.handleRequest(i); } }
运行结果如下:
ConcreteHandler1 处理请求数2 ConcreteHandler1 处理请求数5 ConcreteHandler2 处理请求数14 ConcreteHandler3 处理请求数22 ConcreteHandler2 处理请求数18 ConcreteHandler1 处理请求数3 ConcreteHandler3 处理请求数27 ConcreteHandler3 处理请求数20