专业编程基础技术教程

网站首页 > 基础教程 正文

快速带你彻底弄懂23种设计模式-责任链模式

ccvgpt 2024-08-20 12:57:08 基础教程 11 ℃

模式定义:

为请求创建了一个接收者对象的链。

快速带你彻底弄懂23种设计模式-责任链模式


它是一种线性数据结构,可能是数组,可能是链表,并且可能是多个请求


例如一个request,依次判断请求频率,登录认证,访问权限,敏感词过滤等等。

传统的在一个方法中实现,从需求角度是满足了,但是从代码的可维护性,可复用性就不友好了,不易拓展和维护。


应用场景:

一个请求的处理需要多个对象当中的一个或多个协作处理。


优点:

1)请求的发送者和接受者解耦

2)可以控制执行顺序

3)符合开闭原则和单一职责原则


经典应用:

javax.servlet.Filter

javax.servlet.FilterChain


通过使用责任链模式改造则是比较常规的操作。

  1. 使用链表实现责任链模式。

实现方式如下:

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;}
} 

执行结果如下:


Tags:

最近发表
标签列表