职责链模式

为什么引入职责链模式

作为学生的我们,都有过请假的体验,当我们想请假的时候,我们都会写好请假条让班主任签字,然后将假条拿到教导主任处,让其也签字,经过两到门槛,终于可以出校门了,这种需要多重判决,大家共同承担责任的场景就需要责任链模式。

什么是职责链模式

避免将请求发送者和接受者耦合在一起,让多个对象都有机会接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

核心思想

将多个处理对象,连接起来,每个请求都可以接受请求,即每个对象中都有包含下一个将要处理请求的对象,用于将请求传递给下一个对象。

具体案例

当我们申请请假,如果请假天数小于2天,则直接由班长决定,如果大于2天小于5天,由班主任决定,如果大于5天小于15天,则由教导主任决定,如果大于15天,则由校长决定。

UML:

代码:

package com.dong.Duty;

public class Day {
	private int request_day;

	public int getRequest_day() {
		return request_day;
	}
	public void setRequest_day(int request_day) {
		this.request_day = request_day;
	}
}

package com.dong.Duty;

public interface Operator {
	public void Determine(int day);
}

package com.dong.Duty;

public class Monitor implements Operator {
	
	Day day = new Day();
	private Operator teacher = (Operator) new Teacher();

	@Override
	public void Determine(int day) {
		if( day >= 3) {
			System.out.println("向上级申请......");
			teacher.Determine(day);
		}
		else
			System.out.println("班长已受理");	
	}
}

package com.dong.Duty;

public class Teacher implements Operator{
	
	Director_of_Teaching dot = new Director_of_Teaching();
	@Override
	public void Determine(int day) {
		if( 3 < day && day <= 5)
			System.out.println("班主任已受理");
		else {
			System.out.println("向上级申请......");
			dot.Determine(day);
		}
	}
}

package com.dong.Duty;

public class Director_of_Teaching implements Operator{
	
	Principal pri =new Principal();
	
	@Override
	public void Determine(int day) {
		if( 5 < day && day <= 15)
			System.out.println("教导主任已经受理");
		else
		{
			System.out.println("向上级申请......");
			pri.Determine(day);
		}
	}	
}

package com.dong.Duty;

public class Principal implements Operator {

	@Override
	public void Determine(int day) {
		System.out.println("校长已受理");
	}
}

package com.dong.Duty;
/**
 *注意本程序没有对输入的值进行一波判断,因为有可能输入负数,小数等等,字符串等等
 * 请假天数为15天
 *结果:
 * 	向上级申请......
	向上级申请......
	教导主任已经受理
 * @author liuD
 *
 */
public class client {
	public static void main(String[] args) {
		Day day =new Day();
		day.setRequest_day(15);
		
		Monitor monitor= new Monitor();
		Teacher teacher = new Teacher();
		Director_of_Teaching dot = new Director_of_Teaching();
		Principal principal = new Principal();
		
		monitor.Determine(day.getRequest_day());
	}
}

优点

解耦程度高,如果想对某个部分进行扩充的话,十分方便,责任明确。

缺点

性能问题,因为每个请求都必须走一遍责任链,如果数据过于大,则每次都必须完整的走遍所有的责任链。

调试不是很方便。