博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式入门之职责链模式Chain Of Responsibility
阅读量:5111 次
发布时间:2019-06-13

本文共 2636 字,大约阅读时间需要 8 分钟。

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

转载于:https://www.cnblogs.com/zfyouxi/p/3785835.html

你可能感兴趣的文章
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
Java 多态 虚方法
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>