Chain of Responsibility(责任链模式)

Chain of Responsibility(责任链模式)

应用场景

  • 在论坛中发表文章
  • 后台要经过信息处理才可以发表或者进入数据库

简单用法

  • 处理一段字符串
  • 不同的Filter做不同的事情
import java.util.ArrayList;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Msg msg = new Msg();
        msg.setMsg("大家好:), <script> ,欢迎访问 mashibing.com, 大家都是996");
        ArrayList<Filter> filters = new ArrayList<>();
        
        //链式 不同的Filter 做不同的处理
        filters.add(new HTMLFilter());
        filters.add(new SensitiveFilter());
        
        for (Filter filter : filters) {
    
    
            filter.doFiler(msg);
        }
        System.out.println(msg);
    }
}

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 + '\'' +
                '}';
    }
}

interface Filter{
    
    
    void doFiler(Msg m);
}

class HTMLFilter implements Filter{
    
    
    @Override
    public void doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace('<', '[');
        r = r.replace('>', ']');
        m.setMsg(r);
    }
}

class SensitiveFilter implements Filter{
    
    
    @Override
    public void doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace("996", "955");
        m.setMsg(r);
    }
}

在这里插入图片描述
在这里插入图片描述

责任链增加(门面模式)后的写法

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

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Msg msg = new Msg();
        msg.setMsg("大家好:), <script> ,欢迎访问 mashibing.com, 大家都是996");

        FilterChain filterChain = new FilterChain();
        //链式 不同的Filter 做不同的处理
        filterChain.add(new HTMLFilter());
        filterChain.add(new SensitiveFilter());

        filterChain.doFilter(msg);

        System.out.println(msg);
    }
}

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 + '\'' +
                '}';
    }
}

interface Filter{
    
    
    void doFiler(Msg m);
}

class HTMLFilter implements Filter{
    
    
    @Override
    public void doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace('<', '[');
        r = r.replace('>', ']');
        m.setMsg(r);
    }
}

class SensitiveFilter implements Filter{
    
    
    @Override
    public void doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace("996", "955");
        m.setMsg(r);
    }
}

class FilterChain{
    
    
     List<Filter> list = new ArrayList<>();

    public void add(Filter filter){
    
    
        list.add(filter);
    }

    public void doFilter(Msg m){
    
    
        for (Filter filter : list) {
    
    
            filter.doFiler(m);
        }
    }
}

最终写法

  • FilterChain其实自己也是一个Filter
  • 只不过FilterChain是链条中做决定是否继续执行的Filter
  • 不同的Filter都是链条的一部分
  • 每个Filter做自己的事情
import java.util.ArrayList;
import java.util.List;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Msg msg = new Msg();
        msg.setMsg("大家好:), <script> ,欢迎访问 mashibing.com, 大家都是996");

        FilterChain f = new FilterChain();
        FilterChain f2 = new FilterChain();
        //链式 不同的Filter 做不同的处理
        f.add(new HTMLFilter())
                .add(new SensitiveFilter());

        f2.add(new FaceFilter())
                .add(new URLFilter());

        f.add(f2);

        f.doFiler(msg);
        System.out.println(msg);
    }
}

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 + '\'' +
                '}';
    }
}

interface Filter{
    
    
    void doFiler(Msg m);
}

class HTMLFilter implements Filter{
    
    
    @Override
    public void doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace('<', '[');
        r = r.replace('>', ']');
        m.setMsg(r);
    }
}

class SensitiveFilter implements Filter{
    
    
    @Override
    public void doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace("996", "955");
        m.setMsg(r);
    }
}

class FaceFilter implements Filter{
    
    
    @Override
    public void doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace(":)", "0.0");
        m.setMsg(r);
    }
}

class URLFilter implements Filter{
    
    
    @Override
    public void doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace("mashibing.com", "www.baidu.com");
        m.setMsg(r);
    }
}

class FilterChain implements Filter{
    
    
     List<Filter> list = new ArrayList<>();

    public FilterChain add(Filter filter){
    
    
        list.add(filter);
        return this;
    }

    @Override
    public void doFiler(Msg m) {
    
    
        for (Filter filter : list) {
    
    
            filter.doFiler(m);
        }
    }
}

在这里插入图片描述

一个没通过后面都不会执行

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

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Msg msg = new Msg();
        msg.setMsg("大家好:), <script> ,欢迎访问 mashibing.com, 大家都是996");

        FilterChain f = new FilterChain();
        FilterChain f2 = new FilterChain();
        //链式 不同的Filter 做不同的处理
        f.add(new HTMLFilter())
                .add(new SensitiveFilter());

        f2.add(new FaceFilter())
                .add(new URLFilter());

        f.add(f2);

        f.doFiler(msg);
        System.out.println(msg);
    }
}

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 + '\'' +
                '}';
    }
}

interface Filter{
    
    
    boolean doFiler(Msg m);
}

class HTMLFilter implements Filter{
    
    
    @Override
    public boolean doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace('<', '[');
        r = r.replace('>', ']');
        m.setMsg(r);
        return true;
    }
}

class SensitiveFilter implements Filter{
    
    
    @Override
    public boolean doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace("996", "955");
        m.setMsg(r);
        return false;
    }
}

class FaceFilter implements Filter{
    
    
    @Override
    public boolean doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace(":)", "0.0");
        m.setMsg(r);
        return true;
    }
}

class URLFilter implements Filter{
    
    
    @Override
    public boolean doFiler(Msg m) {
    
    
        String r = m.getMsg();
        r = r.replace("mashibing.com", "www.baidu.com");
        m.setMsg(r);
        return true;
    }
}

class FilterChain implements Filter{
    
    
     List<Filter> list = new ArrayList<>();

    public FilterChain add(Filter filter){
    
    
        list.add(filter);
        return this;
    }

    @Override
    public boolean doFiler(Msg m) {
    
    
        for (Filter filter : list) {
    
    
            if(!filter.doFiler(m)){
    
    
                return false;
            }
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/yuell102/article/details/107980160