Chain ofResponsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。
这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
解决问题:
职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
责任链模式的基本条件:
1,对象链的组织。需要将某任务的所有职责执行对象以链的形式加以组织。
2,消息或请求的传递。将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。
3,处于对象链中的对象的职责分配。不同的对象完成不同的职责。
4,任务的完成。处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。
责任链模式的UML图:
角色和职责:
Handler :处理类的抽象父类。
concreteHandler :具体的处理类。
代码示例:
/**
* 处理类的抽象父类
* @author arain.liu
*/
public abstract class CarHandler {
protected CarHandler carHandler;
public CarHandler setNextHandler(CarHandler carHandler){
this.carHandler = carHandler;
return this.carHandler;
}
public abstract void handlerCar();
}
/**
* 具体处理类
* @author arain.liu
*/
public class CarHeadHandler extends CarHandler {
@Override
public void handlerCar() {
System.out.println("组装车头");
if (this.carHandler != null) {
this.carHandler.handlerCar();
}
}
}
/**
* 具体处理类
* @author arain.liu
*/
public class CarBodyHandler extends CarHandler {
@Override
public void handlerCar() {
System.out.println("组装车身");
if (this.carHandler != null) {
this.carHandler.handlerCar();
}
}
}
/**
* 具体处理类
* @author arain.liu
*/
public class CarTailHandler extends CarHandler {
@Override
public void handlerCar() {
System.out.println("组装车尾");
if (this.carHandler != null) {
this.carHandler.handlerCar();
}
}
}
/**
* client类
* @author arain.liu
*/
public class MainClass {
public static void main(String[] args) {
CarHandler headH = new CarHeadHandler();
CarHandler bodyH = new CarBodyHandler();
CarHandler tailH = new CarTailHandler();
//组装顺序,车头-->车身-->车尾
headH.setNextHandler(bodyH);
bodyH.setNextHandler(tailH);
//调用职责链的链头来完成操作
headH.handlerCar();
System.out.println("*******************************");
//顺序变为 车身-->车头--车尾
bodyH.setNextHandler(headH);
headH.setNextHandler(tailH);
bodyH.handlerCar();
}
}
优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。