责任链模式(Chain Responsibility)
一、定义:属于行为型设计模式,包含传递的数据、创建处理的抽象和实现、创建链条、将数据传递给顶端节点;
二、UML图
三、实现
1、需要传递处理的数据类
import java.util.Date;
/**
* 需要处理的数据信息
*/
public class RequestData {
private Long id;
private String message;
private Date date;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "RequestData{" +
"id=" + id +
", message='" + message + '\'' +
", date=" + date +
'}';
}
}
2、抽象处理类(也可以是接口)
public abstract class AbstractRequestDataHandler {
protected AbstractRequestDataHandler next;
public AbstractRequestDataHandler getNext() {
return next;
}
public void setNext(AbstractRequestDataHandler next) {
this.next = next;
}
/**
* 抽象的处理方法,传入需要处理的数据类
*
* @param data
*/
public abstract void handler(RequestData data);
}
3、具体处理实现
public class RequestDataHandlerA extends AbstractRequestDataHandler {
@Override
public void handler(RequestData data) {
System.out.println("处理类A!");
String message = data.getMessage().replace("A", "");
data.setMessage(message);
if (next != null) {
next.handler(data);
} else {
System.out.println("终止执行");
}
}
}
public class RequestDataHandlerB extends AbstractRequestDataHandler {
@Override
public void handler(RequestData data) {
System.out.println("处理类B!");
String message = data.getMessage().replace("B", "");
data.setMessage(message);
if (next != null) {
next.handler(data);
} else {
System.out.println("终止执行");
}
}
}
public class RequestDataHandlerC extends AbstractRequestDataHandler {
@Override
public void handler(RequestData data) {
System.out.println("处理类C!");
String message = data.getMessage().replace("C", "");
data.setMessage(message);
if (next != null) {
next.handler(data);
} else {
System.out.println("终止执行");
}
}
}
4、客户端
public class ChainResponsibilityClient {
public static void main(String[] args) {
AbstractRequestDataHandler handler1 = new RequestDataHandlerA();
AbstractRequestDataHandler handler2 = new RequestDataHandlerB();
AbstractRequestDataHandler handler3 = new RequestDataHandlerC();
//生成调用链条
handler1.setNext(handler2);
handler2.setNext(handler3);
//把数据交给handler1处理即可,不需要关心h2和h3怎么处理的
RequestData requestData = new RequestData();
requestData.setMessage("ABCDE");
handler1.handler(requestData);
System.out.println(requestData.getMessage());
}
}
四、责任链模式需要注意的地方
1、循环调用,比如下列代码会造成循环调用:
//生成调用链条
handler1.setNext(handler2);
handler2.setNext(handler3);
handler3.setNext(handler1);
2、链条太长可能会导致的性能问题
3、责任链的顶端和低端节点之间不应该存在耦合问题