zoukankan      html  css  js  c++  java
  • 设计模式入门之职责链模式Chain Of Responsibility

    //职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.
    //实例:申请费用的功能,不同金额的费用须要由不同的上级部分审核通过,假设下级没有审核的权限那么就让上级来进行审核
    //上代码
    //定义职责对象的接口
    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);
    			}
    		}
    	}
    }
    //client測试
    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.假设想要动态指定处理一个请求的对象集合。

    职责链模式能够动态构建职责链,也就是动态地来决定究竟哪些职责对象来參与到处理请求中来,相当于是动态地指定了处理一个请求的职责对象集合。


  • 相关阅读:
    WebApi系列知识总结
    用Jquery选择器计算table中的某一列某一行的合计
    layui table指定某一行样式
    数据库-SqlServer 行转列,列转行
    数据库缓存之Memcache知识点
    hdu 2471 简单DP
    nyist0j 35 表达式求值
    html 实现网址链接
    nyist 220 推桌子
    nyist 500 一字棋
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5232300.html
Copyright © 2011-2022 走看看