一、知其然
责任链字面含义第一联想到的就是他是一个链式的行为,就像一个链条一样把所产生的动力传输到到齿轮上一样;还有类似生活中的一个游戏“击鼓传花”,这样说好像也是泛泛而谈,来看看度娘的官方概念(摘自百度百科):
责任链模式_百度百科责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。https://baike.baidu.com/item/%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F/5295498?fromModule=lemma_inlink 嗯看完大概有点朦胧的概念了,下面开始细说一下这种设计模式的特点。
二、知其所以然
2.1、核心特点
2.1.1、特点一 抽象处理接口(AbstractHandler)
一般他定义了需要子类去实现的核心方法,还有一个成员变量代表下一个节点的引用。大概样子就是长这样:
UML图:
代码样子(简单例子便于方便理解):
package com.chain.test;
/**
* 抽象处理接口
*
*/
public abstract class AbstractHandler {
/**链式引用*/
AbstractHandler next;
/**抽象行为方法留给子类去实现*/
protected abstract void handlerRequest();
public AbstractHandler getNext() {
return next;
}
public void setNext(AbstractHandler next) {
this.next = next;
}
}
2.2、特点二 具体处理者(ConcreteHandler)
具体处理业务逻辑的处理实现类它的核心特点其实就是接收请求要么处理要么丢给下一个处理者。
UML图:
代码样子(简单例子便于方便理解):
package com.chain.test;
/**
* 具体责任链处理者实现类
*
*/
public class ConcreteTypeHandler extends AbstractHandler {
@Override
protected boolean handlerRequest(String params) {
if("one".equals(params)) {
System.out.println("第一个处理者");
return Boolean.TRUE;
}else {
if(super.getNext()!=null) {
System.out.println("下一个处理者不为空传递给下一个处理者");
return super.getNext().handlerRequest(params);
}
}
return Boolean.FALSE;
}
}
package com.chain.test;
/**
* 具体责任链处理者实现类
*
*/
public class ConcreteBusinessHandler extends AbstractHandler {
@Override
protected boolean handlerRequest(String params) {
if("two".equals(params)) {
System.out.println("第二个处理者");
return Boolean.TRUE;
}else {
if(super.getNext()!=null) {
System.out.println("下一个处理者不为空传递给下一个处理者");
return super.getNext().handlerRequest(params);
}
}
return Boolean.FALSE;
}
}
是不是觉得有点感觉和思路了,下面实际跑一个demo验证下。
三、行是知之始,知是行之成
上面我们简单介绍了适配器模式的特点,下面我们针对以上代码来编写一个demo这样就能更深入的理解对应的特点;废话不多说直接上代码(这里实际沿用了上面编写的大部分框架,只编写实际测试类)。
package com.chain.test;
/**
* 具体责任链处理者实现类
*
*/
public class ConcreteBusinessHandler extends AbstractHandler {
@Override
protected boolean handlerRequest(String params) {
if("two".equals(params)) {
System.out.println("第二个处理者");
return Boolean.TRUE;
}else {
if(super.getNext()!=null) {
System.out.println("下一个处理者不为空传递给下一个处理者");
return super.getNext().handlerRequest(params);
}
}
return Boolean.FALSE;
}
}
相信大家看完后表情肯定是这样的,开个玩笑放松一下,是的就是这么简单,实际中大家可以根据自己的诉求更换入参以及返回值做到灵活使用。
四、不待思量,过耳便晓
前面我们说了这个设计模式有些特点,就是他有一个抽象行为定义,以及指向下一个节点的引用,实际继承抽象行为的只需要实现自身关注的行为就好了,大概他的最终UML关系就是这样。
这时候有人会说你说了这么多也没觉得它有多好,其实实际如果不用设计模式的话有人就会用IF ELSE来代替这些处理场景,不是说IF ELSE 不能处理这种系统流程判断,而是实际中IF ELSE更适合判断计算逻辑;责任链完美的诠释了开闭原则和单一原则,松散的耦合也更利于代码扩展和维护。
五、路漫漫其修远
最后希望大家看完文章后对自己有深入的收获,没有什么完美的设计模式,只是说有适合的场景中去合理利用;加入设计模式的目的并不是说为了炫技,代码的最终目的还是为了解决实际问题,甚至也是向完美艺术的升华。