Java设计模式:责任链模式的介绍及代码演示

220 阅读3分钟

责任链模式介绍

责任链模式指的是,在设计阶段将请求与处理进行分离,请求的处理被分为多个处理器,只有在运行阶段才能确定使用哪个处理器去处理请求。打个比方说,现在要跟公司请假,有些请假原因部门经理可以直接审批,但是有些请假原因必须要老板进行审批,这种情况就需要部门经理将请假请求转发给老板去处理,这种将请求进行传递的过程就形成了一条责任链。

image.png

如果要通过代码去实现责任链模式的请假审批功能,首先需要创建一个抽象的处理器类,包含用来存储具体实现类的属性,再创建两个具体的实现类,一个表示部门经理的处理方式,一个表示老板对请求的处理。

责任链模式示例代码

创建一个抽象的处理器类

/**
 * 抽象处理器
 */
public abstract class HandlerAbstract {
	//指向责任链中的下一个处理器
	protected HandlerAbstract nextHandler;

	public void setNextHandler(HandlerAbstract nextHandler) {
		this.nextHandler = nextHandler;
	}
	
	/**
	 * 处理请假的抽象方法
	 * type='病假',部门经理直接审批,否则交给老板处理
	 */
	public abstract void handle(String type);
}

抽象处理器包含一个存储下一处理器的属性,如果当前处理器无法处理请求,转交给这个处理器去处理。handle()是处理请求的具体方法,这里如果type==病假,部门经理处理器可以直接处理,否则转交给Boss处理器。

创建两个具体的处理器类

/**
 * 部门经理处理请假申请
 */
public class ManagerHandler extends HandlerAbstract{
	@Override
	public void handle(String type) {
		if(type.equals("病假")) {
			System.out.println("部门经理审批完成:同意");
		}else {
			System.out.println("部门经理没有权限,转交Boss处理");
			this.nextHandler.handle(type);
		}
	}
}
/**
 * Boss处理请假申请
 */
public class BossHandler extends HandlerAbstract {

	@Override
	public void handle(String type) {
		System.out.println("Boss审批完成:同意");
	}
}

具体的处理类,实现了handle()方法,并且由于两个处理器得到职责不同,处理请求的方式也是不一样的。

创建客户端类,发起请假申请

public class test_01 {
	public static void main(String[] args) throws InterruptedException {
		HandlerAbstract manager = new ManagerHandler();
		HandlerAbstract boss = new BossHandler();
		manager.setNextHandler(boss);
		manager.handle("其他");
	}
}

测试类中,显示创建了表示部门经理的处理器,又创建了表示Boss的处理器,紧接着通过manager.setNextHandler(boss)让部门经理处理器指向Boss处理器,当遇到部门经理无法处理的请求时,就可以直接转发给Boss处理器了,最后调用处理器的处理方法,运行结果如下:

image.png

可以看到,当请求到达部门经理时,由于请假的类型不是病假,所以部门经理没有审批权限只能交给Boss去处理,最终Boss处理器批准了请假申请。

总结

当一个请求的处理方式需要在运行时才能确定,就可以选用责任链模式。这种设计模式中的对象结构是链式的,如果需要新增或删除处理器,会非常容易,保证了灵活性和扩展性,并且在调用请求的时候,不会知道请求最终被哪个处理器处理,所以降低了客户端和处理器之间的耦合度。