职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
发出请求的客户端并不知道哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。
Handler 处理请求的接口。
ConcreteHandler1,ConreteHandler2,具体的请求处理类,处理它所负责的请求,可以访问它的后继者,如果不能处理,就将请求转发给后继者。
Handler
abstract class Handler{// 后继者,如果不能处理当前请求,则转发到后继者进行处理protected Handler successor;// 设置继任者public void setSuccessor(Handler successor){this.successor = successor;}public abstract void handleRequest(int request);
}
ConcreteHandler
class ConcreteHandler1 extends Handler{public void handleRequest(int request){if (request >=0 && request < 10){System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);}else if (successor != null){// 处理不了当前请求,后继者进行处理successor.handleRequest(request);}}
}
class ConcreteHandler2 extends Handler{public void handleRequest(int request){if (request >=10 && request < 20){System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);}else if (successor != null){successor.handleRequest(request);}}
}
class ConcreteHandler3 extends Handler{public void handleRequest(int request){if (request >=20 && request < 30){System.out.println(this.getClass().getSimpleName()+" 处理请求 "+request);}else if (successor != null){successor.handleRequest(request);}}
}
客户端
public class Test {public static void main(String[] args) {System.out.println("**********************************************"); System.out.println("《大话设计模式》代码样例");System.out.println(); Handler h1 = new ConcreteHandler1();Handler h2 = new ConcreteHandler2();Handler h3 = new ConcreteHandler3();h1.setSuccessor(h2);h2.setSuccessor(h3);int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };for(int request : requests) {h1.handleRequest(request);}System.out.println();System.out.println("**********************************************");}
}
当客户提交一个请求时,请求是沿链传递直至有一个 ConcreteHandler对象负责处理它。
请求者不知道是哪个对象进行处理的。这就使得接收者和发送者都没有对方的明确信息,链路中的对象也不必知道整个链路的结构,只需要知道后继者即可。
可以随时地增加或修改链路的结构,增强了给对象指派职责的灵活性。
也要当心,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。
公司有经理,总监,总经理。不同的请求,需要不同的人处理。可以用职责链模式来处理请求。
Request 请求类。
Manager 管理者抽象类。
CommonManager 经理类。
Direcor 总监类。
GeneralManager 总经理类。
申请类
//申请
class Request {//申请类别private String requestType;public String getRequestType(){return this.requestType;}public void setRequestType(String value){this.requestType = value;}//申请内容private String requestContent;public String getRequestContent(){return this.requestContent;}public void setRequestContent(String value){this.requestContent = value;}//数量private int number;public int getNumber(){return this.number;}public void setNumber(int value){this.number = value;}
}
管理者抽象类
abstract class Manager{protected String name;public Manager(String name){this.name = name;}//设置管理者上级protected Manager superior;public void setSuperior(Manager superior){this.superior = superior;}//请求申请public abstract void requestApplications(Request request);
}
具体的管理类
//普通经理
class CommonManager extends Manager{public CommonManager(String name){super(name);}public void requestApplications(Request request){if (request.getRequestType()=="请假" && request.getNumber()<=2)System.out.println(this.name+":"+request.getRequestContent()+ "数量:"+request.getNumber()+"天,被批准");else {if (this.superior != null)this.superior.requestApplications(request);}}
}
//总监
class Director extends Manager{public Director(String name){super(name);}public void requestApplications(Request request){if (request.getRequestType()=="请假" && request.getNumber()<=5)System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"天,被批准");else {if (this.superior != null)this.superior.requestApplications(request);}}
}
//总经理
class GeneralManager extends Manager{public GeneralManager(String name){super(name);}public void requestApplications(Request request){if (request.getRequestType()=="请假"){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"天,被批准");}else if (request.getRequestType()=="加薪" && request.getNumber()<=5000){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,被批准");}else if (request.getRequestType()=="加薪" && request.getNumber()>5000){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,再说吧");}}
}
客户端
public class Test {public static void main(String[] args) {System.out.println("**********************************************"); System.out.println("《大话设计模式》代码样例");System.out.println(); // 设置职责链CommonManager manager = new CommonManager("金利");Director director = new Director("宗剑");GeneralManager generalManager = new GeneralManager("钟精励");manager.setSuperior(director);director.setSuperior(generalManager);// 发起请求Request request = new Request();request.setRequestType("请假");request.setRequestContent("小菜请假");request.setNumber(1);manager.requestApplications(request);Request request2 = new Request();request2.setRequestType("请假");request2.setRequestContent("小菜请假");request2.setNumber(4);manager.requestApplications(request2);Request request3 = new Request();request3.setRequestType("加薪");request3.setRequestContent("小菜请求加薪");request3.setNumber(5000);manager.requestApplications(request3);Request request4 = new Request();request4.setRequestType("加薪");request4.setRequestContent("小菜请求加薪");request4.setNumber(10000);manager.requestApplications(request4);System.out.println();System.out.println("**********************************************");}
}
运行结果
请求者不必知道处理者是谁。想要增加管理者,只需要增加一个具体的管理类,设置好处理的职责链即可,对于客户端是透明的。