责任链模式(Chain Of Responsibility)
1 概念
1、定义
- 为请求创建了一个接受者对象的链。
2、应用场景
- 一个请求的处理需要多个对象当中的一个或几个协作处理。
3、优点
- 请求的发送者和接受者解耦。
- 可以控制执行顺序。
- 符合开闭原则和单一职责原则。
4、源码中的应用
javax.servlet.Filterjavax.servlet.FilterChain
2 实现
package com.xianhuii.designpattern;
public class ChainOfResponsibilityTest {
public static void main(String[] args) {
Request request = new Request(true, false, true, true);
RequestFrequentHandler requestFrequentHandler = new RequestFrequentHandler(new LoggingHandler(null));
if (requestFrequentHandler.process(request)) {
System.out.println("正常业务处理");
} else {
System.out.println("访问异常");
}
}
}
class Request {
private boolean loggedOn;
private boolean frequentOk;
private boolean isPermits;
private boolean containsSensitiveWords;
private String requestBody;
public Request(boolean loggedOn, boolean frequentOk, boolean isPermits, boolean containsSensitiveWords) {
this.loggedOn = loggedOn;
this.frequentOk = frequentOk;
this.isPermits = isPermits;
this.containsSensitiveWords = containsSensitiveWords;
}
public boolean isLoggedOn() {
return loggedOn;
}
public boolean isFrequentOk() {
return frequentOk;
}
public boolean isPermits() {
return isPermits;
}
public boolean isContainsSensitiveWords() {
return containsSensitiveWords;
}
}
abstract class Handler {
Handler next;
public Handler(Handler next) {
this.next = next;
}
public Handler getNext() {
return next;
}
public void setNext(Handler next) {
this.next = next;
}
abstract boolean process(Request request);
}
class RequestFrequentHandler extends Handler {
public RequestFrequentHandler(Handler next) {
super(next);
}
@Override
boolean process(Request request) {
System.out.println("访问频率控制");
if (request.isFrequentOk()) {
Handler next = getNext();
if (next == null) {
return true;
}
if (!next.process(request)) {
return false;
} else {
return true;
}
}
return false;
}
}
class LoggingHandler extends Handler {
public LoggingHandler(Handler next) {
super(next);
}
@Override
boolean process(Request request) {
System.out.println("登录验证");
if (request.isLoggedOn()) {
Handler next = getNext();
if (null == next) {
return true;
}
if (!next.process(request)) {
return false;
} else {
return true;
}
}
return false;
}
} 
京公网安备 11010502036488号