模式定义:
为请求创建了一个接收者对象的链。
它是一种线性数据结构,可能是数组,可能是链表,并且可能是多个请求
例如一个request,依次判断请求频率,登录认证,访问权限,敏感词过滤等等。
传统的在一个方法中实现,从需求角度是满足了,但是从代码的可维护性,可复用性就不友好了,不易拓展和维护。
应用场景:
一个请求的处理需要多个对象当中的一个或多个协作处理。
优点:
1)请求的发送者和接受者解耦
2)可以控制执行顺序
3)符合开闭原则和单一职责原则
经典应用:
javax.servlet.Filter
javax.servlet.FilterChain
通过使用责任链模式改造则是比较常规的操作。
- 使用链表实现责任链模式。
实现方式如下:
public class ChainOfResponsbilityTest {
public static void main(String[] args) {
Request request = new Request.RequestBuilder().isfrequentOk(true).isloggedOn(true).build();
RequestFrequentHandler requestFrequentHandler = new RequestFrequentHandler(new RequestLoggedOnHandler(null));
boolean process = requestFrequentHandler.process(request);
if (process == true) {
System.out.println(" 业务正常处理 " );
}else{
System.out.println(" 业务处理异常 " );
}
}
}
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 next.process(request);
}
}
class RequestLoggedOnHandler extends Handler {
public RequestLoggedOnHandler(Handler next) {
super(next);
}
@Override
boolean process(Request request) {
System.out.println(" 登录控制. ");
if(request.isLoggedOn()){
Handler next = getNext();
if(next == null){
return true;
}
// if (!next.process(request)) {
//
// return false;
// }else
// return true;
}
return next.process(request);
}
}
//我们的请求就让先模拟一下,判断是否成功就用boolean值来代替
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;
}
static class RequestBuilder {
private boolean loggedOn;
private boolean frequentOk;
private boolean isPermits;
private boolean containsSensitiveWords;
/*public RequestBuilder(boolean loggedOn, boolean frequentOk, boolean isPermits, boolean containsSensitiveWords) {
this.loggedOn = loggedOn;
this.frequentOk = frequentOk;
this.isPermits = isPermits;
this.containsSensitiveWords = containsSensitiveWords;
}*/
public RequestBuilder isloggedOn(boolean loggedOn){
this.loggedOn = loggedOn;
return this;
}
public RequestBuilder isfrequentOk(boolean frequentOk){
this.frequentOk = frequentOk;
return this;
}
public RequestBuilder isPermits(boolean isPermits){
this.isPermits = isPermits;
return this;
}
public RequestBuilder iscontainsSensitiveWords(boolean containsSensitiveWords){
this.containsSensitiveWords = containsSensitiveWords;
return this;
}
public Request build(){
Request request = new Request(loggedOn,frequentOk,isPermits,containsSensitiveWords);
return request;
}
@Override
public String toString() {
return "RequestBuilder{" +
"loggedOn=" + loggedOn +
", frequentOk=" + frequentOk +
", isPermits=" + isPermits +
", containsSensitiveWords=" + containsSensitiveWords +
'}';
}
}
public boolean isLoggedOn(){return loggedOn;}
public boolean isFrequentOk(){return frequentOk;}
public boolean isPermits(){return isPermits;}
public boolean iscontainsSensitiveWords(){return containsSensitiveWords;}
}
执行结果如下: