职责链模式
为什么引入职责链模式
作为学生的我们,都有过请假的体验,当我们想请假的时候,我们都会写好请假条让班主任签字,然后将假条拿到教导主任处,让其也签字,经过两到门槛,终于可以出校门了,这种需要多重判决,大家共同承担责任的场景就需要责任链模式。
什么是职责链模式
避免将请求发送者和接受者耦合在一起,让多个对象都有机会接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
核心思想
将多个处理对象,连接起来,每个请求都可以接受请求,即每个对象中都有包含下一个将要处理请求的对象,用于将请求传递给下一个对象。
具体案例
当我们申请请假,如果请假天数小于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());
}
}
优点
解耦程度高,如果想对某个部分进行扩充的话,十分方便,责任明确。
缺点
性能问题,因为每个请求都必须走一遍责任链,如果数据过于大,则每次都必须完整的走遍所有的责任链。
调试不是很方便。