职责链模式(java版)

原创 2016年08月29日 11:53:06

1.引入

职责链模式就是有多个对象的情况下,每个对象都可以传值给下个对象,然后依次往下到最后一个对象,形成一条链。而请求的发出者发出请求,沿着链依次传递值到最后接收者(不一定是最后的节点)。这就保证了请求者和接收者的解耦,请求内容会从头到尾,但是请求者与接收者却毫无关系并且请求者对于到底是谁处理了请求也全然不知。

2.举例

工作中,当我们的编程水平提高,业务能力提升时,往往都会计划加薪,能者高薪嘛!但是公司的加薪制度一般都是申请,然后请求者发送加薪的请求,先发给部门经理,部门经理允许了但是却做不了主,就得提交到分公司经理,然后允许了也做不了主,就得给总公司经理CEO去处理,然后将处理结果进行返回。对于请假也是一样的,如果请的是短假几天,部门经理就直接可以做主,如果请假的时间长了,就得分公司经理允许并做主。如果时间太长了,那么只能总公司的经理允许并做主。所以从请求者到部门经理到分公司经理到总公司经理,这样请求就是一条链。请求者请长时间的假就需要总公司的经理允许并做主,但是请求者只是把请求交给了部门经理,却不知道是谁做主。

3.实现

--3.1.请求类(请求内容):

</pre></p><p><span style="font-size:14px;"></span><pre name="code" class="html">public class Request {

	//请求类型
	private String requestType;
	//请求内容
	private String requestContent;
	//请求的时间(金额)
	private int requestTime;
	public String getRequestType() {
		return requestType;
	}
	public void setRequestType(String requestType) {
		this.requestType = requestType;
	}
	public String getRequestContent() {
		return requestContent;
	}
	public void setRequestContent(String requestContent) {
		this.requestContent = requestContent;
	}
	public int getRequestTime() {
		return requestTime;
	}
	public void setRequestTime(int requestTime) {
		this.requestTime = requestTime;
	}
}

--3.2.经理抽象类:

public abstract class Manager {

	protected Manager manager;

	protected String name;
	public Manager(String name){
		this.name=name;
	}
	public void setManager(Manager manager) {
		this.manager = manager;
	}
	public abstract void requestApplication(Request request);
	
}

解释:每个管理者的名字都通过构造器传入。方法requestApplication通过传入请求者的请求。如果在实现者的权利范围则处理不在权利范围则向上提交。

--3.3.部门经理实现类:

public class DepartmentManager extends Manager{

	public DepartmentManager(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void requestApplication(Request request) {
		// TODO Auto-generated method stub
		if(request.getRequestType().equals("请假") && request.getRequestTime()<=2){
			System.out.println(name+"允许请假:"+request.getRequestContent()+","+request.getRequestTime()+"天");
		}else{
			if(manager!=null){
				manager.requestApplication(request);
			}
		}
	}

}
解释:如果在实现者的权利范围则处理不在权利范围则向上提交。

--3.4.分公司经理实现类:

public class BranchManager extends Manager{

	public BranchManager(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void requestApplication(Request request) {
		// TODO Auto-generated method stub
		if(request.getRequestType().equals("请假") && request.getRequestTime()>2 && request.getRequestTime()<=7){
			System.out.println(name+"允许请假,"+request.getRequestContent()+","+request.getRequestTime()+"天");
		}else{
			if(manager !=null){
				manager.requestApplication(request);
			}
		}
	}

}

--3.5.总公司经理实现类:

public class CEO extends Manager{

	public CEO(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void requestApplication(Request request) {
		// TODO Auto-generated method stub
		if(request.getRequestType().equals("请假") && request.getRequestTime()>7 && request.getRequestTime()<=30){
			System.out.println(name+"允许请求,"+request.getRequestContent()+","+request.getRequestTime()+"天");
		}else if(request.getRequestType().equals("请假") && request.getRequestTime()>30){
			System.out.println(name+"不用来了!");
		}else if(request.getRequestType().equals("加薪") && request.getRequestTime()<=500){
			System.out.println(name+"允许加薪,"+request.getRequestContent()+","+request.getRequestTime()+"元");
		}else if(request.getRequestType().equals("加薪") && request.getRequestTime()>500){
			System.out.println(name+"赶紧离职吧! "+request.getRequestContent()+","+request.getRequestTime());
		}
	}

}

--3.6.测试类:
public class Test {

	public static void main(String[] args) {
		DepartmentManager departmentManager=new DepartmentManager("张部门经理");
		BranchManager branchManager=new BranchManager("李分公司经理");
		CEO ceo=new CEO("王总公司经理");
		
		departmentManager.setManager(branchManager);
		branchManager.setManager(ceo);
		
		Request request=new Request();
		request.setRequestType("请假");
		request.setRequestContent("小菜请假");
		request.setRequestTime(1);
		
		departmentManager.requestApplication(request);
		
		Request request2=new Request();
		request2.setRequestType("请假");
		request2.setRequestContent("小王请假");
		request2.setRequestTime(5);
		departmentManager.requestApplication(request2);
		
		Request request3=new Request();
		request3.setRequestType("加薪");
		request3.setRequestContent("小罗加薪");
		request3.setRequestTime(500);
		departmentManager.requestApplication(request3);
		
		Request request4=new Request();
		request4.setRequestType("加薪");
		request4.setRequestContent("小胡加薪");
		request4.setRequestTime(1000);
		departmentManager.requestApplication(request4);
	}
}

结果:

张部门经理允许请假:小菜请假,1天
李分公司经理允许请假,小王请假,5天
王总公司经理允许加薪,小罗加薪,500元
王总公司经理赶紧离职吧! 小胡加薪,1000元


-------------------------------------------------------------------------------------------

总结:

职责链模式就是将多个对象,以链的方式按照层级规则进行串起来。只能是一对一的方式,这样就使链头到各个节点之间是耦合的状态。

缺点:如果配置错误,那么一个请求可能没有到指定的链的节点就结束了,最终得不到处理。








版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java web filter之二 Filter与职责链模式

上接 java web filter之一 基础实现        多个Filter能够处理同一个页面,一个Filter也能处理多个页面,同时可以通过配置文件灵活的设置要通过Filter进...
  • xqf309
  • xqf309
  • 2013-07-24 19:59
  • 3893

Java 职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 适用场景: 有多个的对象可以处理一个请求,哪个对象处理...

java职责链模式

职责链模式:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。通俗一点说就是,当客户提交一个请求时,从...

第17章_职责链模式

  • 2012-09-27 10:33
  • 1.03MB
  • 下载

【Java设计模式】· 职责链模式(Chain of Responsibility)

职责链模式: 1.觉得学过的东西如果不记下来就太浪费了,还会经常忘掉,于是乎开始写博客。我只是一个菜鸟程序员,但有一颗向往技术大牛的心。 2.职责链模式:当一个问题需要经过“重重考虑”才能给出结果...

java设计模式系列--职责链模式

http://sishuok.com/forum/blogPost/list/5813.html FYI23.1 场景问题23.1.1 申请聚餐费用来考虑这样一个功能:申请聚餐费用的管理。 很多公...

java设计模式——行为型之职责链模式

Chain of Responsibility Pattern(职责链模式)

java设计模式_职责链模式

一、什么是职责链模式 Chain of Responsibility(CoR)模式也叫职 责链模式或者职责连锁模式,是行为模式之一, 该模式构造一系列分别担当不同的职责的类的对 象来共同完成...

java设计模式之职责链模式 Chain of Responsibility

职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的藕合关系。将这个对象连成一条链 ,并沿着这条链传递该请求,直到有一个对象处理它为止。  1.当客户提交一个请求时,...

Java 设计模式 -- 职责链模式

下面,将通过一个例子,对职责链模式进行介绍。问题:设想,你有一个呼叫中心,员工分成三个层级,接线员,主管和经理。客户来电时会先分配给接线员,若接线员处理不了,就必须将来电往上转给主管,若主管无法处理,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)