拦截过滤器模式

总述

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

过滤器管理者有啥用呢?

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

怎么理解这个客户端呢?

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

什么是应用?

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

图示

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

图示.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);
    }
}

多谢捧场

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



©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 154,867评论 4 353
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 65,736评论 1 283
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 104,751评论 0 235
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,205评论 0 201
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,500评论 3 283
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,058评论 1 201
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,484评论 2 305
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,175评论 0 190
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,811评论 1 234
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,157评论 2 237
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,681评论 1 254
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,045评论 2 245
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,576评论 3 227
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,907评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,613评论 0 190
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,045评论 2 260
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,014评论 2 256

推荐阅读更多精彩内容