设计模式入门之职责链模式Chain Of Responsibility

来源:互联网 发布:状态机编程 编辑:程序博客网 时间:2024/05/01 23:28
//职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.//实例:申请费用的功能,不同金额的费用需要由不同的上级部分审核通过,如果下级没有审核的权限那么就让上级来进行审核//上代码//定义职责对象的接口public abstract class Handler {protected Handler successor = null;public Handler(Handler successor) {this.successor = successor;}public abstract String handleFeeRequest(String user, double fee);}//具体的处理类,项目经理,等级较低public class ProjectManager extends Handler {public String handleFeeRequest(String user, double fee) {String str = "";if(fee < 500) {if("小李".equals(user)) {//假设只同意小李的申请str = "项目经理同意"+user+"聚餐费用"+fee+"元的请求";}else {str = "项目经理不同意"+user+"聚餐费用"+fee+"元的请求";}}else {if(this.successor != null) {return successor.handleFeeRequest(user, fee);}}}}//部门经理public class DepManager extends Handler {public String handleFeeRequest(String user, double fee) {String str = "";if(fee < 1000) {if("小李".equals(user)) {//假设只同意小李的申请str = "部门经理同意"+user+"聚餐费用"+fee+"元的请求";}else {str = "部门经理不同意"+user+"聚餐费用"+fee+"元的请求";}}else {if(this.successor != null) {return successor.handleFeeRequest(user, fee);}}}}//总经理public class GeneralManager extends Handler {public String handleFeeRequest(String user, double fee) {String str = "";if(fee >= 10000) {if("小李".equals(user)) {//假设只同意小李的申请str = "总经理同意"+user+"聚餐费用"+fee+"元的请求";}else {str = "总经理不同意"+user+"聚餐费用"+fee+"元的请求";}}else {if(this.successor != null) {return successor.handleFeeRequest(user, fee);}}}}//客户端测试public class Client {public static void main(String[] args) {Handler h1 = new ProjectManager();Handler h2 = new DepManager();Handler h3 = new GeneralManager();h1.setSuccessor(h2);//设置职责链h2.setSuccessor(h3);String ret1 = h1.handleRequest("小李", 300);System.out.println("the ret1="+ret1);String ret2 = h1.handleRequest("小张", 300);System.out.println("the ret2="+ret2);String ret3 = h1.handleRequest("小李", 300);System.out.println("the ret3="+ret3);String ret4 = h1.handleRequest("小张", 300);System.out.println("the ret4="+ret4);String ret5 = h1.handleRequest("小李", 300);System.out.println("the ret5="+ret5);String ret6 = h1.handleRequest("小张", 300);System.out.println("the ret6="+ret6);}}//职责链模式的本质:分离职责,动态组合//优点:请求者和接受者松散耦合,请求者不需要知道接受者是谁//优点:动态组合职责//缺点:产生很多细粒度对象,不一定能被处理,这时就需要提供默认的处理//职责链模式在找到接受者后就会处理完毕,然后结束//如果找到接受者后进行处理再交给下一个对象处理,那么就成为功能链了,也就是装饰器模式了//何时选择职责链模式://1.如果有多个对象可以处理同一请求,但是具体由哪个对象来处理该请求,是运行时刻动态确定的。//2.如果想在不指明接受者的情况下,向多个对象中的其中一个提交请求。//3.如果想要动态指定处理一个请求的对象集合。职责链模式可以动态构建职责链,也就是动态地来决定到底哪些职责对象来参与到处理请求中来,相当于是动态地指定了处理一个请求的职责对象集合。

1 0
原创粉丝点击