前言
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
模式的定义与特点
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了。
优点:
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
缺点:
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。
代码实现:
创建RequestMessage类:
public class RequestMessage {
private int workNum;
public RequestMessage(int workNum) {
this.workNum = workNum;
}
public int getWorkNum() {
return workNum;
}
}
创建类Person(抽象执行者):
public abstract class Person {
private Person person;
public void setPerson(Person person) {
this.person = person;
}
public Person getPerson() {
return person;
}
public abstract void doRequest(RequestMessage request);
}
三个实现类(具体执行者)Person_A、Person_B、Person_C:
public class Person_A extends Person {
@Override
public void setPerson(Person person) {
super.setPerson(person);
}
@Override
public void doRequest(RequestMessage request) {
if(request.getWorkNum() < 1000){
System.out.println("Person_A 完成了任务!");
}else {
getPerson().doRequest(request);
}
}
}
public class Person_B extends Person {
@Override
public void setPerson(Person person) {
super.setPerson(person);
}
@Override
public void doRequest(RequestMessage request) {
if(request.getWorkNum() < 3000){
System.out.println("Person_B 完成了任务!");
}else {
getPerson().doRequest(request);
}
}
}
public class Person_C extends Person {
@Override
public void setPerson(Person person) {
super.setPerson(person);
}
@Override
public void doRequest(RequestMessage request) {
if(request.getWorkNum() > 3000){
System.out.println("Person_C 完成了任务!");
}else {
getPerson().doRequest(request);
}
}
}
创建Client类:
@Test
public void test(){
RequestMessage request = new RequestMessage(200);
Person_A a = new Person_A();
Person_B b = new Person_B();
Person_C c = new Person_C();
a.setPerson(b);
b.setPerson(c);
c.setPerson(a);
// 让c去完成请求,但c完成不了,任务给a完成
c.doRequest(request);
}
执行结果: