Java设计模式之行为型模式(责任链模式)
责任链模式
概述
责任链模式是将多个处理事件的行为组合成一条链,通过调用链来对事件进行批处理。与单一事件处理不同,责任链模式强调多个事件连续处理,注重事件处理的序列化。
适用场景
一个简单事件运行有一个前提:被触发。一个简单事件只有收到运行的请求才会运行。在程序设计中,若单个简单的事件越来越多,就必然会重复发送许多条相同的请求事件运行的命令。责任链模式就是针对这一问题的。责任链模式将多个事件集成为一个序列化事件,只需发送一个请求运行的请求,就能是这里序列化事件内部的子事件相继运行。
这好比关系型数据库中的事务。事务(Transaction)强调多个单一事件组合成一系列事件处理。处理过程是一步到位的,而不是拆分成许多部,各个单一事件在内部已经按照一定的逻辑关系组合好了。这好比电脑,你只需要按动一下开关,各个设备都相继启动了。
实例分析
背景
现在有一个事件类Handler,Handler中有一个handle方法和一个属性name,并注入getter、setter与构造函数Handler(String name)。现在我们要运行若干个不同name的Handler的handle方法。现在,我们来对比不使用责任链模式和使用责任链模式处理这一需求的效用。
1、不使用责任链模式
- 分析
我们需要处理多个Handler,也就是先要new若干个Handler,用构造方法注入name。
代码:
/**
* @author Hanlin Wang
*/
public class ChainOfResponsibilityMode {
public static void main(String[] args) {
//创建
Handler h1 = new Handler("h1");
Handler h2 = new Handler("h2");
Handler h3 = new Handler("h3");
h1.handle();
h2.handle();
h3.handle();
}
}
class Handler {
//处理器名字
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Handler(String name){
this.name = name;
}
//处理
public void handle(){
System.out.println(this.name + " is handling");
}
}
很显然,我们使用了三次handle()方法。若我们new了一百个Handler对象,那岂不是每次写程序就要写一百次handle()方法?很明显不合适。
2、使用了责任链模式
- 分析
既然每个Handler的实例的handle()方法都需要被触发,那么我们可以在一个Handler的实例中注入另一个Handler的实例,并将另一个Handler实例的handle()方法添加到原来的handle()方法中。
代码:
/**
* @author Hanlin Wang
*/
public class ChainOfResponsibilityMode {
public static void main(String[] args) {
//创建
Handler master = new Handler("h1", new Handler("h2", new Handler(
"h3", new Handler("h4"))));
master.handle();
}
}
//定义处理器接口
interface Hand{
void setSubHandler(Handler subHandler);
Handler getSubHandler();
void handle();
}
//定义处理器
class Handler implements Hand{
//处理器名字
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Handler(String name){
this.name = name;
}
public Handler(String name, Handler subHandler){
this.name = name;
this.subHandler = subHandler;
}
//赋予责任的另一个同类
private Handler subHandler;
//注入当前类
public void setSubHandler(Handler subHandler){
this.subHandler = subHandler;
}
//getter方法
public Handler getSubHandler(){
return this.subHandler;
}
//处理
public void handle(){
System.out.println(this.name + " is handling");
if (this.getSubHandler()!=null) {
this.subHandler.handle();
}
}
}
Tips:处理器接口是一种编程规范,这样体现了程序的扩展性与聚合性。
运行结果:
h1 is handling
h2 is handling
h3 is handling
h4 is handling
可见,通过master.handle()一句,就将四个Handler的实例对象的handle()方法相继调用了,这就是关于责任链模式的一个例子。