关闭

职责链模式(java版)

287人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:138519次
    • 积分:3404
    • 等级:
    • 排名:第10714名
    • 原创:196篇
    • 转载:42篇
    • 译文:0篇
    • 评论:17条
    博客专栏
    关于我
    最新评论