职责链是一种行为设计模式,容许你将请求沿着处理者链进行发送。收到请求后,每一个处理者都可对请求进行处理,或将其传递给链上的下个处理者。 java
在这种模式中,一般每一个接收者都包含对另外一个接收者的引用。若是一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推,直到有对象处理它为止(也可能没有),如此使得每一个接收者都有机会接收和处理请求。设计模式
对于调用者来讲,调用者只须要将请求发送到职责链上便可,无须关心请求的处理细节和请求的传递,因此责任链也将请求的发送者和处理者进行了解耦。缓存
一个事件须要通过多个对象处理是一个挺常见的场景,譬如客服咨询流程,采购审批流程,请假流程,软件开发中的异常处理流程,过滤系统等各类各样的流程,能够考虑使用责任链模式来实现。 cookie
如图,假如你刚购置了一个新的硬件设备,可是链接上电脑并不能正确执行,因而你决定拨打技术支持电话。网络
首先你会听到自动回复器的机器合成语音,它提供了针对各类问题的九个经常使用解决方案,你按照提示操做,机器人将你转接到一位人工客服人员。dom
客服发现问题的技术性比较强,没法提供任何具体的解决方案。因而他将你转接到一位技术工程师。ide
最后,工程师告诉了你新硬件设备驱动程序的下载网址,以及操做步骤,你按照说明解决了问题,几经周折,终于大功告成。 函数
以请假流程为例,通常公司普通员工的请假流程简化以下 ui
public interface Handler {
/** * 处理请假 * * @param days 请假天数 * @return 是否批准 */
boolean handleHoliday(int days);
/** * 设置责任链的下一个处理者 * * @param h 下一个处理者 */
void setNext(Handler h);
}
public class BaseHandler implements Handler {
private Handler next;
@Override
public boolean handleHoliday(int days) {
if (next != null) {
return next.handleHoliday(days);
} else {
System.out.println("未批准");
return false;
}
}
@Override
public void setNext(Handler h) {
next = h;
}
}
public class LeaderManager extends BaseHandler {
@Override
public boolean handleHoliday(int days) {
if (days <= 3) {
System.out.println("LeaderManager 批准");
return true;
} else {
return super.handleHoliday(days);
}
}
}
public class ProjectManager extends BaseHandler {
@Override
public boolean handleHoliday(int days) {
if (days <= 7) {
System.out.println("ProjectManager 批准");
return true;
} else {
return super.handleHoliday(days);
}
}
}
public class DeptManager extends BaseHandler {
@Override
public boolean handleHoliday(int days) {
System.out.println("DeptManager 批准");
return true;
}
}
public class Client {
public static void main(String[] args) {
Handler leaderManager = new LeaderManager();
Handler projectManager = new ProjectManager();
Handler deptManager = new DeptManager();
leaderManager.setNext(projectManager);
projectManager.setNext(deptManager);
leaderManager.handleHoliday(5);
}
}
// Logcat:
// ProjectManager 批准
复制代码
Android 事件传递机制this
public boolean dispatchTouchEvent(MotionEvent event){
boolean consume = false;
if (onInterceptTouchEvent(event)) {
consume = onTouchEvent(event);
} else {
consume = child.dispatchTouchEvent(event);
}
return consume;
}
复制代码
“一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不容许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的状况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求能够最终不被任何接收端对象所接收。
纯的责任链模式的实际例子很难找到,通常看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。可是在实际的系统里,纯的责任链很难找到。若是坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。 ”
Router?
OkHttp Interceptor
/** * 项目中自定义的 Interceptor */
object DomainSwitchInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
val requestDomain = request.url().host()
val domainManager = DomainManagerFactory.getInstance().getDomainManagerByDomain(requestDomain)
val currentDomain = domainManager?.pickHostWithoutSchema()
if (currentDomain != null && requestDomain != currentDomain) {
request = request.newBuilder()
.url(request.url().newBuilder().host(currentDomain).build())
.build()
}
return chain.proceed(request)
}
}
/** * 将自定义 Interceptor 添加到 OkHttp * 最终添加到 OkHttpClient 静态内部类 Builder 的 final List<Interceptor> interceptors 中 */
object RetrofitRestClient {
val defaultOkHttpClient: OkHttpClient by lazy {
VolleyManager.getOkHttpClient()
.newBuilder()
.addInterceptor(RequestCommonParamsInterceptor)
.addInterceptor(DomainSwitchInterceptor)
.addInterceptor(RequestMonitorInterceptor)
.dns(HttpDns)
.build()
}
}
/** * 全部请求都是从 OkHttp 的 RealCall 的 getResponseWithInterceptorChain() 方法开始 */
Response getResponseWithInterceptorChain() throws IOException {
// Build a full stack of interceptors.
List<Interceptor> interceptors = new ArrayList<>();
interceptors.addAll(client.interceptors()); // client.interceptors()包含了自定义的拦截器
interceptors.add(retryAndFollowUpInterceptor);
interceptors.add(new BridgeInterceptor(client.cookieJar()));
interceptors.add(new CacheInterceptor(client.internalCache()));
interceptors.add(new ConnectInterceptor(client));
if (!forWebSocket) {
interceptors.addAll(client.networkInterceptors());
}
interceptors.add(new CallServerInterceptor(forWebSocket));
// 将全部 Interceptor 放入 RealInterceptorChain 构造责任链
Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
originalRequest, this, eventListener, client.connectTimeoutMillis(),
client.readTimeoutMillis(), client.writeTimeoutMillis());
return chain.proceed(originalRequest);
}
/** * OkHttp Interceptor */
public interface Interceptor {
Response intercept(Chain chain) throws IOException;
/** * 构建责任链的接口 */
interface Chain {
Request request();
Response proceed(Request request) throws IOException;
@Nullable Connection connection();
Call call();
int connectTimeoutMillis();
Chain withConnectTimeout(int timeout, TimeUnit unit);
int readTimeoutMillis();
Chain withReadTimeout(int timeout, TimeUnit unit);
int writeTimeoutMillis();
Chain withWriteTimeout(int timeout, TimeUnit unit);
}
}
/** * Chain 的实现类 RealInterceptorChain 的 proceed 方法 */
public Response proceed(Request request, StreamAllocation streamAllocation, HttpCodec httpCodec,
RealConnection connection) throws IOException {
if (index >= interceptors.size()) throw new AssertionError();
calls++;
// Call the next interceptor in the chain.
RealInterceptorChain next = new RealInterceptorChain(interceptors, streamAllocation, httpCodec,
connection, index + 1, request, call, eventListener, connectTimeout, readTimeout,
writeTimeout);
Interceptor interceptor = interceptors.get(index);
Response response = interceptor.intercept(next);
return response;
}
复制代码
Article by Panxc