关闭

职责链模式(java版)

392人阅读 评论(2) 收藏 举报
分类:

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元


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

总结:

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

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








1
0
查看评论

状态模式 VS 职责链模式

这次合作开发过程中我们使用了一些设计模式,经过讨论对其理解深刻不少。之前在学习之中,我本以为自己已经理解了一些设计模式。但在这次的使用过程中,因为各自的理解不一造成了一定的碰撞,之后才发现自己的理解根本就站不住脚。于是,反复经过我们的讨论——实施——再讨论,发现理解的偏差,解决之。然后,才有了目前我...
  • zhuojiajin
  • zhuojiajin
  • 2013-12-05 11:09
  • 2563

Java设计模式之责任链模式、职责链模式

继续介绍23种设计模式系列,本文介绍的是职责链模式。
  • jason0539
  • jason0539
  • 2015-04-18 07:41
  • 24961

《大话设计模式》-- 第24个 职责链模式

此时学设计模式只能有个大致的了解,不能理解其到底要用在何处,但是先大概根据书中描述留个简单的印象,以后在设计代码时可以有点印象,遇到具体的问题可以类比实践下。 今天学习一下《大话设计模式》中的第24个设计模式,职责链模式,这种模式用在来了一个请求时,从已有的处理类中找到一个合适的类来处理这个请求。...
  • anbreakdy
  • anbreakdy
  • 2016-10-28 00:02
  • 126

【学习笔记javascript设计模式与开发实践(职责链模式)----13】

第13章 职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到一个对象处理它为止。 职责链模式的名字非常形象,一系列可能会处理请求的对象被连接成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理...
  • pigpigpig4587
  • pigpigpig4587
  • 2015-12-31 16:23
  • 718

职责链设计模式解决if else多分支问题

具体方案具体分析,此代码适合分类业务进行的if else操作,解决多分支问题 //方案一:职责链设计模式 #include #include #include #include using namespace std; typedef string KV; class Proc...
  • mafuli007
  • mafuli007
  • 2012-10-29 19:04
  • 2242

23种经典设计模式的java实现_5_职责链模式

对于职责链模式,一般是这么定义的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,即——将这些对象连成一条(处理)链,并沿着这条链传递该请求,直到这条链结束同时有一个对象处理它为止。最经典的职责链模式应用就是JavaEE规范中web.xml的filter了,filters按照...
  • kthq
  • kthq
  • 2007-07-28 16:27
  • 4917

责任链模式(chain)—员工请假

定义: 责任链模式是对象的行为模式,在责任链模式里,很多对象由每一个对象对其下家的引用而链接起来形成一条链,请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道哪一个对象处理此请求,这使得系统在不影响客户端的情况下动态的重新组织和分配责任。 角色列表: 抽象处理...
  • wugouzi
  • wugouzi
  • 2016-01-21 13:53
  • 624

《设计模式 ● 责任链》之业务场景

/************************************************************************************************** ** 模式的初衷,无非是为我们经常出现问题的业务逻辑或系统结构提供好的解决方案,不论 ** 是高...
  • webwalker
  • webwalker
  • 2012-03-21 16:29
  • 4602

大话设计模式-职责链模式

1.当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它【DP】 2.接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用【DP】。 ...
  • dizzthxl
  • dizzthxl
  • 2012-07-24 17:09
  • 326

用代码和UML图化解设计模式之《责任链模式》

责任链模式,用我的理解就是动作的处理链表。根据请求的不同类型,在链表查找相应类型的处理者。处理者是一个链表。 wiki上说明 wikipedia的定义为:CoR pattern consists of a source of command objects and a series of pro...
  • wallwind
  • wallwind
  • 2012-11-06 20:20
  • 2128
    个人资料
    • 访问:181560次
    • 积分:3921
    • 等级:
    • 排名:第9565名
    • 原创:206篇
    • 转载:41篇
    • 译文:0篇
    • 评论:21条
    博客专栏
    关于我
    最新评论
    音乐