美文网首页
拦截过滤器模式

拦截过滤器模式

作者: Stroman | 来源:发表于2019-11-07 19:14 被阅读0次

    总述

    最简化的应用场景就是,发送方要发送信息给接收方。但是呢,在信息传输的过程中要经过层层筛选和过滤,这个就是拦截过滤器模式的基本意思了。
    就好比你要喝水,但是担心水里不干净,于是安了个净水器,那么从自来水龙头到你的水杯之间,就经过了层层过滤和筛选。
    就好像你要乘飞机,从进入航站楼门口到进入机舱之间还要经过层层的安检。
    我就举这俩例子来说明拦截过滤器模式的基本思想,我觉得已经很通俗易懂了,你再不明白我就没办法了。

    过滤器管理者有啥用呢?

    它是负责维护过滤器链条的维修工、包工头、负责人,它负责管理这个过滤器链。你要面对的是不同类型的功能模块,而不是多个同类型的东西,因此要把很多同类型的东西进行统一管理,于是就有了这个过滤器管理者的存在。

    怎么理解这个客户端呢?

    它是一个隔离层,或者是一个对接的接口。它一边和用户对接,一边和过滤器管理者对接。就好像是常见的图形化操作界面的意思。这是软件设计中层次化的提现,可以让系统结构清晰,功能明确,是非常好的做法。

    什么是应用?

    我就觉得这个名字起的不好,容易让人理解偏了,我觉得把它叫做消息接收方最恰当,你就按照这个名字去理解才能比较好地理解到。

    图示

    我觉得单单靠类图难以直观表达这个模式要做的事情。

    图示.png

    类图

    类图.png

    效果

    正在对水进行沙土过滤
    正在对水进行细菌过滤
    正在对水进行虫卵过滤
    最终还是喝到了水
    
    Process finished with exit code 0
    

    调用

    package com.company;
    
    public class Main {
    
        public static void main(String[] args) {
        // write your code here
            FilterManager manager = new FilterManager();
            manager.addFilter(new Filter1());
            manager.addFilter(new Filter2());
            manager.addFilter(new Filter3());
            manager.setReceiver(new Receiver());
    
            OperationClient client = new OperationClient();
            client.setManager(manager);
            client.inputMessage("水");
        }
    }
    
    

    过滤器接口

    package com.company;
    
    public interface Filter {
        /**
         * 执行过滤的方法,是所有过滤器必须要实现的方法。
         * @param inputString
         */
        public void executeFilt(String inputString);
    }
    
    

    第1个滤镜

    package com.company;
    
    public class Filter1 implements Filter {
        @Override
        public void executeFilt(String inputString) {
            System.out.println("正在对" + inputString + "进行沙土过滤");
        }
    }
    
    

    第2个滤镜

    package com.company;
    
    public class Filter2 implements Filter {
        @Override
        public void executeFilt(String inputString) {
            System.out.println("正在对" + inputString + "进行细菌过滤");
        }
    }
    
    

    第3个过滤器

    package com.company;
    
    public class Filter3 implements Filter {
        @Override
        public void executeFilt(String inputString) {
            System.out.println("正在对" + inputString + "进行虫卵过滤");
        }
    }
    

    过滤器管理者

    package com.company;
    
    public class FilterManager {
        private FilterChain chain;
    
        public FilterManager() {
            this.chain = new FilterChain();
        }
    
        public void addFilter(Filter aFilter) {
            this.chain.addFilter(aFilter);
        }
    
        public void setReceiver(Receiver receiver) {
            this.chain.setReceiver(receiver);
        }
    
        public void proccessMessage(String inputString) {
            this.chain.execute(inputString);
        }
    }
    
    

    图形化操作层次

    package com.company;
    
    public class OperationClient {
        private FilterManager manager;
    
        public void setManager(FilterManager manager) {
            this.manager = manager;
        }
    
        public void inputMessage(String message) {
            this.manager.proccessMessage(message);
        }
    }
    

    过滤器链

    package com.company;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class FilterChain {
        private List<Filter> filters;
        private Receiver receiver;
    
        public FilterChain() {
            this.filters = new ArrayList<>();
        }
    
        public void setReceiver(Receiver receiver) {
            this.receiver = receiver;
        }
    
        public void execute(String inputString) {
            for (Filter iterator:this.filters) {
                iterator.executeFilt(inputString);
            }
            if (this.receiver != null) {
                this.receiver.getMessage(inputString);
            }
        }
    
        public void addFilter(Filter aFilter) {
            this.filters.add(aFilter);
        }
    }
    
    

    最终接收端

    package com.company;
    
    public class Receiver {
        /**
         * 接收者最终接收到了经过层层过滤的消息。
         * @param inputString
         */
        public void getMessage(String inputString) {
            System.out.println("最终还是喝到了" + inputString);
        }
    }
    
    

    多谢捧场

    如果您觉得我的文章有价值,那么赏脸打赏一个,鄙人感激不尽。不过,不打赏看看也是好的,如果有不对的地方,还请您多多指正。



    相关文章

      网友评论

          本文标题:拦截过滤器模式

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