您的位置:首页 > 编程语言 > Java开发

设计模式学习笔记---职责链模式chain of responsibility(Java版)

2015-03-04 15:51 791 查看
创建型模式:关注对象的创建工程。

结构型模式:关注对象和类的组织。

行为型模式:关注系统中对象的相互交互研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。

一、场景

打牌时,轮流出牌

接力赛跑

公文审批

二、实质

将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能,则处理。如果不能,则传递给链上的下一个对象。

三、示例(请假条的审批)

请假条审批过程:

小于3天--主任审批

3-10天-- 经理审批

10-30天--总经理审批

大于30天--提示拒绝



package com.lgd.chainofresponsibility;

/**
 * 请假的基本信息
 * @author liguodong
 *
 */
public class LeaveRequest {
	private String empName;
	private int leaveDays;
	private String reason;
	public LeaveRequest(String empName, int leaveDays, String reason) {
		super();
		this.empName = empName;
		this.leaveDays = leaveDays;
		this.reason = reason;
	}
	public String getEmpName() {
		return empName;
	}
	public void setEmpName(String empName) {
		this.empName = empName;
	}
	public int getLeaveDays() {
		return leaveDays;
	}
	public void setLeaveDays(int leaveDays) {
		this.leaveDays = leaveDays;
	}
	public String getReason() {
		return reason;
	}
	public void setReason(String reason) {
		this.reason = reason;
	}
	
}


package com.lgd.chainofresponsibility;
/**
 * 抽象类
 * @author liguodong
 *
 */
public abstract class Leader {
	protected String name;
	protected Leader nextLeader;//责任链上的后继对象
	public Leader(String name) {
		super();
		this.name = name;
	}
	//设定责任链上的后继对象
	public void setNextLeader(Leader nextLeader) {
		this.nextLeader = nextLeader;
	}
	/*********************/
	//处理请求的核心业务方法
	public abstract void handleRequest(LeaveRequest request);
}


package com.lgd.chainofresponsibility;

public class Director extends Leader{

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

	@Override
	public void handleRequest(LeaveRequest request) {
		// TODO Auto-generated method stub
		if(request.getLeaveDays()<3){
			System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("主任:"+this.name+",审批通过!");
		}else{
			if(this.nextLeader!=null)
			{
				this.nextLeader.handleRequest(request);
			}
		}
	}
	
	
}


package com.lgd.chainofresponsibility;

public class Manager extends Leader{

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

	@Override
	public void handleRequest(LeaveRequest request) {
		// TODO Auto-generated method stub
		if(request.getLeaveDays()<10){
			System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("经理:"+this.name+",审批通过!");
		}else{
			if(this.nextLeader!=null)
			{
				this.nextLeader.handleRequest(request);
			}
		}
	}	
}


package com.lgd.chainofresponsibility;

public class GeneralManager extends Leader{

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

	@Override
	public void handleRequest(LeaveRequest request) {
		// TODO Auto-generated method stub
		if(request.getLeaveDays()<30){
			System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("总经理:"+this.name+",审批通过!");
		}else{
			System.out.println("莫非"+request.getEmpName()+"想辞职,居然请假"+request.getLeaveDays()+"天!");
		}
	}
}


package com.lgd.chainofresponsibility;

public class Client {
	public static void main(String[] args) {
		Leader aLeader = new Director("张山");
		Leader bLeader = new Manager("李斯");
		Leader cLeader = new GeneralManager("王五");
		//组织责任链对象的关系
		aLeader.setNextLeader(bLeader);
		bLeader.setNextLeader(cLeader);
		
		//开始请假操作
		LeaveRequest req1 = new LeaveRequest("Tom", 10, "回火星");
		aLeader.handleRequest(req1);
	}
}


四、两种方式

链表方式实现责任链(如上示例所示)

非链表方式实现责任链

通过集合、数组生成职责链更加实用。实际上,很多项目中,每个具体的Handle并不是由开发团队定义的,而是项目上线后由外部单位追加的,所以使用链表方式定义COR链就很困难。

五、开发场景

Java异常机制 一个try对应多个catch,当一个catch不匹配类型,则自动跳到第二个catch中。

JavaScript中,事件的冒泡和捕获机制。

Servlet中,过滤器的链式处理。

Struct2中,拦截器的调用也是责任链。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: