责任链模式

作者: Stephenwish | 来源:发表于2020-07-24 23:33 被阅读0次
第一步准备一个接口,和多个实现类,以及准备一个消息类
public interface MyFilter {
     void doFilter(Msg msg);
}

public class XFilterImpl implements MyFilter{

    @Override
    public void doFilter(Msg msg) {
        String s = msg.getName().replace("a", "A");
        msg.setName(s);
    }
}
public class XFilterImpl implements MyFilter{

    @Override
    public void doFilter(Msg msg) {
        String s = msg.getName().replace("a", "A");
        msg.setName(s);
    }
}

public class ZFilterImpl implements MyFilter{



    @Override
    public void doFilter(Msg msg) {
        String s1 = msg.getName().replace("<", "[");
        msg.setName(s1);
        String s2 = msg.getName().replace(">", "]");
        msg.setName(s2);
    }
}
//这个类这是用来做被处理对象,不是设计思想的一环
public class Msg {
    private String name;

    public String getName() {
        return name;
    }

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

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

第二步,新建一个包装类,实现可以顺序执行,可以新增链条类,就像链条环节一节节执行
public class FilterChain {
//重要,这个类需要集合装载实现类,再for遍历执行
    private List<MyFilter> filters=new ArrayList<>();
    public void  doFilter(Msg msg){
        for (MyFilter filter : filters) {
            filter.doFilter(msg);
        }
    }

    public void addFilter(MyFilter filter){
        filters.add(filter);
    }
}
第三步,新建客户端检测这个简单的责任链模式,待会在升级高级一点版本
public class Client {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setName("<asdfghj123456>");

        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new XFilterImpl());
        filterChain.addFilter(new YFilterImpl());
        filterChain.addFilter(new ZFilterImpl());

        filterChain.doFilter(msg);

        System.err.println(msg);

    }
}

\color{red}\bigstar新增要求可以链式编程

public class FilterChain {
    private List<MyFilter> filters=new ArrayList<>();


    public void  doFilter(Msg msg){
        for (MyFilter filter : filters) {
            filter.doFilter(msg);
        }
    }

//把原来返回空的改为返回对象本身
    public FilterChain addFilter(MyFilter filter){
        filters.add(filter);
        return  this;
    }



}

\color{red}\bigstar再新增需求,一个链条实现类在客户端。要求xyz的 FilterChain和abc的 FilterChain可以拼接

//ABC实现类自行参照XYZ书写

public class Client {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setName("<asdfghj123456>");

        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new XFilterImpl());
        filterChain.addFilter(new YFilterImpl());
        filterChain.addFilter(new ZFilterImpl());


        FilterChain filterChain2 = new FilterChain();
        filterChain.addFilter(new AFilterImpl());
        filterChain.addFilter(new BFilterImpl());
        filterChain.addFilter(new CFilterImpl());


    //后面代码会合并下面2行
        filterChain.doFilter(msg);
        filterChain2.doFilter(msg);
        System.err.println(msg);

    }
}




改造FilterChain,也是实现MyFilter,用来合并上面代码提到的合并
public class FilterChain implements MyFilter{
    private List<MyFilter> filters=new ArrayList<>();

    public FilterChain addFilter(MyFilter filter){
        filters.add(filter);
        return  this;
    }

    @Override
    public void doFilter(Msg msg) {
        for (MyFilter filter : filters) {
            filter.doFilter(msg);
        }
    }
}




//分割线--------------------------------------------------------------------------------------

public class Client {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setName("<asdfghj123456>");

        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new XFilterImpl())
                .addFilter(new YFilterImpl())
                .addFilter(new ZFilterImpl());

        FilterChain filterChain2 = new FilterChain()
        .addFilter(new AFilterImpl())
        .addFilter(new BFilterImpl())
        .addFilter(new CFilterImpl());

        filterChain.addFilter(filterChain2);
        filterChain.doFilter(msg);


        System.err.println(msg);

    }
}


\color{red}\bigstar再新增要求,假如有个实现类(xyzabc中的一个)不满足要求直接不要下一环节,类似if的短路处理

public interface MyFilter {
     //当为true的时候继续往下执行
     boolean doFilter(Msg msg);
}

//修改所有实现了该接口实现类其中最重要FilterChain
public class FilterChain implements MyFilter{
    private List<MyFilter> filters=new ArrayList<>();

    public FilterChain addFilter(MyFilter filter){
        filters.add(filter);
        return  this;
    }

    @Override
    public boolean doFilter(Msg msg) {
        for (MyFilter filter : filters) {
            //其中有一个为false,就返回false
            if (!filter.doFilter(msg))return false;
        }
        return true;
    }
}


相关文章

网友评论

    本文标题:责任链模式

    本文链接:https://www.haomeiwen.com/subject/kpfelktx.html