专栏首页赵KK日常技术记录大话设计模式之---责任链模式

大话设计模式之---责任链模式

责任链模式,又称职责链模式,Chain Of Responsibility,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

根据代码来体验,模仿前端消息传递过滤。

package com.kk;
/**
 * @author zhaokk
 * @create 2019-12-08-10:06
 */
public class ChainOfResponsibility {
    public static void main(String[] args) {
        Msg msg = new Msg();
        //消息接收
        msg.setMsg("你好:),<script>,欢迎的来到996icu");
        String str=msg.getMsg();
        str = str.replace('<', '[');
        str= str.replace('>',']');
        msg.setMsg(str);
        str= str.replaceAll("996icu","955happy");
        msg.setMsg(str);
        //过滤
        System.out.println(msg.getMsg());
    }
}

class Msg {
    String name;
    String msg;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "Msg{" +
                "name='" + name + '\'' +
                ", msg='" + msg + '\'' +
                '}';
    }
}

输出:

D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\bin\java.exe "-javaagent:D:\idea\IntelliJ IDEA 2019.1.1\lib\idea_rt.jar=51670:D:\idea\IntelliJ IDEA 2019.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\charsets.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\deploy.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\access-bridge-64.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\cldrdata.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\dnsns.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\jaccess.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\jfxrt.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\localedata.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\nashorn.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunec.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunjce_provider.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunmscapi.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunpkcs11.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\zipfs.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\javaws.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jce.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jfr.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jfxswt.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jsse.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\management-agent.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\plugin.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\resources.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\rt.jar;D:\project01\target\classes;C:\Users\14620\.m2\repository\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;C:\Users\14620\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\14620\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\14620\.m2\repository\org\slf4j\slf4j-log4j12\1.7.7\slf4j-log4j12-1.7.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-classic\1.1.7\logback-classic-1.1.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-core\1.1.7\logback-core-1.1.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-access\1.1.7\logback-access-1.1.7.jar;C:\Users\14620\.m2\repository\org\apache\logging\log4j\log4j-core\2.5\log4j-core-2.5.jar;C:\Users\14620\.m2\repository\org\apache\logging\log4j\log4j-api\2.5\log4j-api-2.5.jar;C:\Users\14620\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\14620\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar com.kk.ChainOfResponsibility
你好:),[script],欢迎的来到955happy

Process finished with exit code 0

这里的消息指request请求获取缓存中消息,或者用户输入消息,当进行消息过滤时,添加一个特殊符号过滤,添加一个敏感词过滤处理消息。但当增加需求或者改变敏感词时,需要增加新功能,且耦合较高。

将变化的代码逻辑封装变化

处理信息的部分是变化的

我们定义一个接口为Filter

package com.kk;
/**
 * @author zhaokk
 * @create 2019-12-08-10:24
 */
public interface Filter {
    void dofilter(Msg msg);
}

处理信息的两个实现类

package com.kk;

/**
 * 特殊符号
 * @author zhaokk
 * @create 2019-12-08-10:26
 */
public class SpecialFilter implements Filter{
    public void dofilter(Msg msg) {
        String str=msg.getMsg();
        str = str.replace('<', '[');
        str= str.replace('>',']');
        msg.setMsg(str);
    }
}
package com.kk;

/**
 * 敏感词
 * @author zhaokk
 * @create 2019-12-08-10:27
 */
public class SensitiveFilter implements Filter {

    public void dofilter(Msg msg) {
        String str=msg.getMsg();
        str= str.replaceAll("996icu","955happy");
        msg.setMsg(str);
    }
}
public class ChainOfResponsibility {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("你好:),<script>,欢迎的来到996icu");
        new SpecialFilter().dofilter(msg);
        new SensitiveFilter().dofilter(msg);
       /* String str=msg.getMsg();
        str = str.replace('<', '[');
        str= str.replace('>',']');
        msg.setMsg(str);
        str= str.replaceAll("996icu","955happy");
        msg.setMsg(str);*/
        System.out.println(msg.getMsg());
    }
}

输出:

D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\bin\java.exe "-javaagent:D:\idea\IntelliJ IDEA 2019.1.1\lib\idea_rt.jar=52130:D:\idea\IntelliJ IDEA 2019.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\charsets.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\deploy.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\access-bridge-64.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\cldrdata.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\dnsns.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\jaccess.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\jfxrt.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\localedata.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\nashorn.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunec.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunjce_provider.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunmscapi.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunpkcs11.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\zipfs.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\javaws.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jce.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jfr.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jfxswt.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jsse.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\management-agent.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\plugin.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\resources.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\rt.jar;D:\project01\target\classes;C:\Users\14620\.m2\repository\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;C:\Users\14620\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\14620\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\14620\.m2\repository\org\slf4j\slf4j-log4j12\1.7.7\slf4j-log4j12-1.7.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-classic\1.1.7\logback-classic-1.1.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-core\1.1.7\logback-core-1.1.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-access\1.1.7\logback-access-1.1.7.jar;C:\Users\14620\.m2\repository\org\apache\logging\log4j\log4j-core\2.5\log4j-core-2.5.jar;C:\Users\14620\.m2\repository\org\apache\logging\log4j\log4j-api\2.5\log4j-api-2.5.jar;C:\Users\14620\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\14620\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar com.kk.ChainOfResponsibility
你好:),[script],欢迎的来到955happySun Dec 08 10:32:19 CST 2019
Process finished with exit code 0

但是此时如果新的业务逻辑进入还需要定义并引入Filter,如果将所有的Filter放入List,foreachList,也可以将多个Filter穿起来,但是新的Filter增加特需要add。且循环过程中,需要所有Filter过滤完才放出.定义一个

FilterChain

ackage com.kk;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhaokk
 * @create 2019-12-08-10:40
 */
public class FilterChain {
    List<Filter> filterList=new ArrayList<Filter>();
    private Msg msg;

    public void add(Filter filter){
        filterList.add(filter);
    }
    public void  doFilter(Msg msg){
        for (Filter filter : filterList) {
            filter.dofilter(msg);
        }
    }
}

处理逻辑

public class ChainOfResponsibility {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("你好:),<script>,欢迎的来到996icu");
        FilterChain fc = new FilterChain();
        fc.add(new SpecialFilter());
        fc.add(new SensitiveFilter());
        fc.doFilter(msg);
       /* String str=msg.getMsg();
        str = str.replace('<', '[');
        str= str.replace('>',']');
        msg.setMsg(str);
        str= str.replaceAll("996icu","955happy");
        msg.setMsg(str);*/
        System.out.println(msg.getMsg()+new Date());
    }
}

输出:

D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\bin\java.exe "-javaagent:D:\idea\IntelliJ IDEA 2019.1.1\lib\idea_rt.jar=52490:D:\idea\IntelliJ IDEA 2019.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\charsets.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\deploy.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\access-bridge-64.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\cldrdata.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\dnsns.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\jaccess.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\jfxrt.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\localedata.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\nashorn.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunec.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunjce_provider.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunmscapi.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunpkcs11.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\zipfs.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\javaws.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jce.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jfr.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jfxswt.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jsse.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\management-agent.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\plugin.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\resources.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\rt.jar;D:\project01\target\classes;C:\Users\14620\.m2\repository\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;C:\Users\14620\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\14620\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\14620\.m2\repository\org\slf4j\slf4j-log4j12\1.7.7\slf4j-log4j12-1.7.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-classic\1.1.7\logback-classic-1.1.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-core\1.1.7\logback-core-1.1.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-access\1.1.7\logback-access-1.1.7.jar;C:\Users\14620\.m2\repository\org\apache\logging\log4j\log4j-core\2.5\log4j-core-2.5.jar;C:\Users\14620\.m2\repository\org\apache\logging\log4j\log4j-api\2.5\log4j-api-2.5.jar;C:\Users\14620\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\14620\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar com.kk.ChainOfResponsibility
你好:),[script],欢迎的来到955happySun Dec 08 10:53:22 CST 2019
Process finished with exit code 0

此时我们再增加一个对消息处理的RedisFilter,

package com.kk;
/**
 * @author zhaokk
 * @create 2019-12-08-10:58
 */
public class RedisFilter implements Filter {
    public void doFilter(Msg msg) {
        String rediskry="TH"+msg;
        rediskry.replace(":)","");
        msg.setMsg(rediskry);
    }
}

然后让FilterChain也实现Filter接口

public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("你好:),<script>,欢迎的来到996icu");


        FilterChain fc = new FilterChain();
        fc.add(new SpecialFilter())
                .add(new SensitiveFilter());
        FilterChain fc2 = new FilterChain();
        fc2.add(new RedisFilter());
        fc2.doFilter(msg);
        fc.doFilter(msg);
        //fc.add(new SensitiveFilter());
       /* String str=msg.getMsg();
        str = str.replace('<', '[');
        str= str.replace('>',']');
        msg.setMsg(str);
        str= str.replaceAll("996icu","955happy");
        msg.setMsg(str);*/
        System.out.println(msg.getMsg()+new Date());
    }

但是这里的消息,必须一条责任链处理完,另一条责任链也要处理

将一个链条看做是Filter加到FilterChain链中

fc.add(fc2);

在某一个filter中决定是否继续往下处理

将Filter返回boolean

public interface Filter {
    Boolean doFilter(Msg msg);
}

其他三个过滤器除敏感词返回false外返回true

public class SensitiveFilter implements Filter {
    public Boolean doFilter(Msg msg) {
        String str=msg.getMsg();
        str= str.replaceAll("996icu","955happy");
        msg.setMsg(str);
        return false;
    }
}

在filterChain中

public Boolean doFilter(Msg msg) {
        for (Filter filter : filterList) {
            if (!filter.doFilter(msg)) {
                return false;
            }
        }
        return true;
    }

此时在三个责任链中第二个是返回false,第三个是不予执行的,RedisFilter效果不被执行

D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\bin\java.exe "-javaagent:D:\idea\IntelliJ IDEA 2019.1.1\lib\idea_rt.jar=52994:D:\idea\IntelliJ IDEA 2019.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\charsets.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\deploy.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\access-bridge-64.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\cldrdata.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\dnsns.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\jaccess.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\jfxrt.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\localedata.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\nashorn.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunec.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunjce_provider.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunmscapi.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\sunpkcs11.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\ext\zipfs.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\javaws.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jce.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jfr.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jfxswt.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\jsse.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\management-agent.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\plugin.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\resources.jar;D:\ProgramFiles\JavaTest\java\jdk1.8.0_141\jre\lib\rt.jar;D:\project01\target\classes;C:\Users\14620\.m2\repository\commons-logging\commons-logging\1.1.3\commons-logging-1.1.3.jar;C:\Users\14620\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Users\14620\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\14620\.m2\repository\org\slf4j\slf4j-log4j12\1.7.7\slf4j-log4j12-1.7.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-classic\1.1.7\logback-classic-1.1.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-core\1.1.7\logback-core-1.1.7.jar;C:\Users\14620\.m2\repository\ch\qos\logback\logback-access\1.1.7\logback-access-1.1.7.jar;C:\Users\14620\.m2\repository\org\apache\logging\log4j\log4j-core\2.5\log4j-core-2.5.jar;C:\Users\14620\.m2\repository\org\apache\logging\log4j\log4j-api\2.5\log4j-api-2.5.jar;C:\Users\14620\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\14620\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar com.kk.ChainOfResponsibility
你好:),[script],欢迎的来到955happySun Dec 08 11:22:49 CST 2019
Process finished with exit code 0

模拟Severlet API Filter

如何在一条责任链处理request与response

response向上返回处理结果

当Filter处理request的时候,让当前的Filter找到下一个Filter,下一个Filter如此,直到处理完再处理response然后向上返回response至第一层

package com.kk;

/**
 * @author zhaokk
 * @create 2019-12-08-10:24
 */
public interface Filter {
    Boolean doFilter(Request request, Response response,FilterChain filterChain);
}

接受者和发送者都没有对方的明确消息,且链中的对象结构也不知道链的结构,职责链可以简化对象的相互连接,且易于扩展

package com.kk;

/**
 * @author zhaokk
 * @create 2019-12-08-10:26
 */
public class SpecialFilter implements Filter {
    public void doFilter(Request request, Response response, FilterChain filterChain) {
        request.setStr(request.getStr().replace('<', '[').replace(">", "]") + "---SpecialFilter()");
        filterChain.doFilter(request, response, filterChain);
        response.setStr(response.getStr() + "---SpecialFilter()");
    }
}
package com.kk;

/**
 * @author zhaokk
 * @create 2019-12-08-10:58
 */
public class RedisFilter implements Filter {
    public void doFilter(Request request, Response response,FilterChain filterChain) {
        String rediskry="TH"+request.getStr();
        request.setStr(rediskry.replace(":)","") + "---SpecialFilter()");
        filterChain.doFilter(request, response, filterChain);
    }
}

FilterChain

package com.kk;
        import java.util.ArrayList;        import java.util.List;
/** * @author zhaokk * @create 2019-12-08-10:40 */public class FilterChain implements Filter {
    List<Filter> filterList = new ArrayList<Filter>();    private Msg msg;
    public FilterChain add(Filter filter) {        filterList.add(filter);        return this;    }
    public void doFilter(Request request, Response response,FilterChain filterChain) {
        filterChain.doFilter(request,response,filterChain);    }}
package com.kk;
        import java.util.ArrayList;        import java.util.List;
/** * @author zhaokk * @create 2019-12-08-10:40 */public class FilterChain implements Filter {
    List<Filter> filterList = new ArrayList<Filter>();    private Msg msg;
    public FilterChain add(Filter filter) {        filterList.add(filter);        return this;    }
    public void doFilter(Request request, Response response,FilterChain filterChain) {
        filterChain.doFilter(request,response,filterChain);    }}

关于设计模式有23种之多,平时看过,只是并不能强化记忆,除了自己做的demo外,很少能第二次用于平时项目,针对性学习,更能加强记忆

为什么平时看资料会累,因为

第一漫无目的

第二看完得不到应用

第三根本不感兴趣

所以有些书,有些视频资料,看一段时间就坚持不下去了

单纯通过公众号学习一门技术是不现实的,只是记录下当下关注的技术点,并不能够达到教学的级别,个人也比较随意,对有些人有帮助,他就觉得你不错,对别人来说没帮助,那就很水,但我的目的不在这,我只是享受多年后回来看的那种成就感

平时一有什么想法我会及时记录到随笔中,并以此为乐趣,有时我们难于表达,这些随笔能记录并激发你的表达能力

本文分享自微信公众号 - 赵KK日常技术记录(gh_cc4c9f1a9521)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 和老李一起手撕山寨Workerman(二)

    我感到一阵阵地无力眩晕,确切说我的脑子里空荡荡的完全不知道要写什么,这第二篇到底该这么开张,难道我连江郎还没到就已然要才尽了吗,当我脑海里飘过这个想法后突然感到...

    老李秀
  • 爬虫破解IP限制–ADSL动态IP服务器–部署小结

    目前遇到的比较难搞的反爬虫技术有两个:特别难识别的人机识别验证码–如极验的手势验证,另外就是ip大量的限制,如R网站两次访问就被强制跳转到验证码页面。现在留下部...

    十四君
  • Redis 事务:将一组命令放在同一个事务中进行处理

    MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令。事务可以一次执行多个命令, 并且带有以下两个重要的保证:

    须臾之余
  • “12306” 的架构到底有多牛逼?

    尤其是春节期间,大家不仅使用 12306,还会考虑“智行”和其他的抢票软件,全国上下几亿人在这段时间都在抢票。

    小小詹同学
  • Redis 是怎么实现 “附近的人” 的?

    针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。

    Java技术栈
  • 缓存雪崩、击穿、穿透,该如何避免?

    帅气迷人的面试官您好,我了解的,目前电商首页以及热点数据都会去做缓存 ,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题。

    黄泽杰
  • Redis持久化(Persistence):了解如何配置redis的持久化。

    在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改...

    须臾之余
  • 高可用性(High Availability):Redis 哨兵是Redis官方的高可用性解决方案

    Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

    须臾之余
  • 运用基于内存的数据库redis构建分布式爬虫–抓妹子图网

    当你能够针对一个url进行请求,获取数据,继续请求的时候,说明你的爬虫已经可以自给自足的爬起来。但是这样的爬虫其效率将会严重限制在单进程效率极限之下,时间的主要...

    十四君
  • 实战 Spring Cloud 微服务架构下的“秒杀”(含代码)

    来源:github.com/coderliguoqing/distributed-seckill/

    用户1516716

扫码关注云+社区

领取腾讯云代金券