在项目中,有应用到,及时整理,方便日后温习。
定义
责任链模式是一种设计模式,也是行为型设计模式之一。多个对象以链条的形式进行连接,链的节点是由每一 个对象引用下一个对象构成。请求在链条的一端发出,并向链的另一端进行传递,直到有对象处理了这个请求,那么传递就终止了,这就是责任链模式。
作用
责任链上的处理者处理请求,而客户端只需要将请求发送到责任链上即可,不需要关心请求的处理过程或请求的传递,这样责任就分得很清楚了,达到请求的发送者和请求的处理者解耦。
优点
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
缺点
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。
使用场景
- 可以多个对象处理同一个请求,具体由那个对象去处理,要看运行时动态决定。
- 在不明确指定接收者的情况下,可以向多个对象中提交一个请求。
- 可以动态指定一组对象处理请求。
角色
- 抽象角色:这个角色通常由一个Java接口或Java抽象类实现,定义。
- 具体处理者角色:这个角色就是接到请求后,可以选择处理掉请求,或者将请求传递给下一个处理者对象处理。
下面通过代码实现一个简单的责任链模式:
1、定义一个抽象角色(BaseHandler)
/**
* @Author 安仔夏天很勤奋
* Create Date is 2020/4/17
* Des 责任链模式的抽象角色
* 1、定义一个处理请求,返回处理结果
* 2、定义当前对象指向下一个处理节点Handler对象的引用。
*/
public abstract class BaseHandler {
//保持当前对象指向下一个处理节点Handler对象的引用。
public BaseHandler nextHandler;
//根据传入的条件处理请求
public abstract String handlerRequest(String condition);
}
2、定义具体处理角色,即具体实现(ConcreteHandler1、ConcreteHandler2、ConcreteHandler3)。继续BaseHandler类,重写handlerRequest()方法。如果传递的条件符合则处理请求,如果不符合条件并存在责任链的下一个处理者对象,则传递给下一个处理者对象处理,反之直接返回错误结果。
/**
* @Author 安仔夏天很勤奋
* Create Date is 2020/4/17
* Des 具体实现者1
*/
public class ConcreteHandler1 extends BaseHandler {
@Override
public String handlerRequest(String condition) {
if("ConcreteHandler1".equals(condition)){
// System.out.println("处理者为:ConcreteHandler1");
return "处理者为:ConcreteHandler1";
}else{
if(nextHandler==null){
return "没有找到处理者["+condition+"],你看着办!";
}
return nextHandler.handlerRequest(condition);
}
}
}
/**
* @Author 安仔夏天很勤奋
* Create Date is 2020/4/17
* Des 具体实现者2
*/
public class ConcreteHandler2 extends BaseHandler {
@Override
public String handlerRequest(String condition) {
if("ConcreteHandler2".equals(condition)){
// System.out.println("处理者为:ConcreteHandler2");
return "处理者为:ConcreteHandler2";
}else{
if(nextHandler==null){
return "没有找到处理者["+condition+"],你看着办!";
}
return nextHandler.handlerRequest(condition);
}
}
}
/**
* @Author 安仔夏天很勤奋
* Create Date is 2020/4/17
* Des 具体实现者3
*/
public class ConcreteHandler3 extends BaseHandler {
@Override
public String handlerRequest(String condition) {
if("ConcreteHandler3".equals(condition)){
// System.out.println("处理者为:ConcreteHandler3");
return "处理者为:ConcreteHandler3";
}else{
if(nextHandler==null){
return "没有找到处理者["+condition+"],你看着办!";
}
return nextHandler.handlerRequest(condition);
}
}
}
3、Client端调用()
/**
* @Author 安仔夏天很勤奋
* Create Date is 2020/4/17
* Des 客户端
*/
public class ClientTest {
public static void main(String[] args){
BaseHandler handler1 = new ConcreteHandler1();
BaseHandler handler2 = new ConcreteHandler2();
BaseHandler handler3 = new ConcreteHandler3();
handler1.nextHandler = handler2;
handler2.nextHandler = handler3;
//打印请求处理后的结果
String result = handler1.handlerRequest("ConcreteHandler3");
System.out.println(result+"");
}
}
上面的责任链模式例子是一个简单版,但多数情况下,责任链中请求和对应处理规则是不尽相同的,在这种情况下可以将请求进行封装,同时对请求的处理规则也进行封装作为一个独立的对象。
网友评论