Filter设计模式,责任链模式一如既往的妙

news2024/11/24 1:20:49

场景1:
每种Filter进行某种处理,将各个Filter连在一起形成一个FilterChain。当需要往FilterChain中加入新的Filter,或者改变各个Filter的处理顺序时,可以方便的扩展。

1个接口:

public interface Filter {
    public String dofilter(String msg);
}

3种实现类:

public class SensitiveWordFilter implements Filter{

    @Override
    public String dofilter(String msg) {
        return msg.replace("fuck", "f**k").replace("Fuck", "F**k");
    }

}
public class StopWordFilter implements Filter{

    @Override
    public String dofilter(String msg) {
        return msg.replace("and", "").replace("to", "").replace("ing", "").replace("is", "");
    }

}
public class FaceFilter implements Filter{

    @Override
    public String dofilter(String msg) {
        return msg.replace(":(", "^V^");
    }

}

用1个FilterChain连接起来:

public class FilterChain implements Filter{

    List<Filter> filters = new ArrayList<Filter>();

    @Override
    public String dofilter(String msg) {
        String r = msg;
        for(Filter f : filters)
            r = f.dofilter(r);
        return r;
    }

    public FilterChain addFilter(Filter f){
        filters.add(f);
        return this;
    }

}

main方法调用:

public class Main {

    public static void main(String[] args){

        String msg = "Today is raining. What a fucking day! :(";

        FilterChain fc = new FilterChain();
        fc.addFilter(new SensitiveWordFilter())
          .addFilter(new StopWordFilter())
          .addFilter(new FaceFilter());

        String result = fc.dofilter(msg);
        System.out.println(msg);
        System.out.println(result);

    }

}

场景2:
客户端==>服务端,参照javax.servlet

2种对象:

public class Request {
    public String requestSTR;
}

public class Response {
    public String responseSTR;
}

1个Filter接口:

public interface Filter {
    public void dofilter(Request request,Response response, FilterChain fc);
}

3种实现类:

public class SensitiveWordFilter implements Filter{

    @Override
    public void dofilter(Request request, Response response, FilterChain fc) {
        request.requestSTR = request.requestSTR.replace("fuck", "f**k").replace("Fuck", "F**k");
        request.requestSTR += "--SensitiveWordFilter()";
        fc.dofilter(request, response, fc);
        response.responseSTR += "--SensitiveWordFilter()";
    }

}

public class StopWordFilter implements Filter{


    @Override
    public void dofilter(Request request, Response response, FilterChain fc) {
        request.requestSTR = request.requestSTR.replace("and", "").replace("to", "").replace("ing", "").replace("is", "");
        request.requestSTR += "--StopWordFilter()";
        fc.dofilter(request, response, fc);
        response.responseSTR += "--StopWordFilter()";
    }

}
public class FaceFilter implements Filter{

    @Override
    public void dofilter(Request request, Response response, FilterChain fc) {
        request.requestSTR = request.requestSTR.replace(":(", "^V^");
        request.requestSTR += "--FaceFilter()";
        fc.dofilter(request, response, fc);
        response.responseSTR += "--FaceFilter()";
    }

}

FilterChain

public class FilterChain implements Filter{

    List<Filter> filters = new ArrayList<Filter>();
    int index = 0;

    public FilterChain addFilter(Filter f){
        filters.add(f);
        return this;
    }


    @Override
    public void dofilter(Request request, Response response, FilterChain fc) {
        if(index == filters.size())
            return;
        Filter f = filters.get(index);
        index++;
        f.dofilter(request, response, this);
    }

}

Main:

public class Main {

    public static void main(String[] args){

        Request request = new Request();
        request.requestSTR = "Today is raining. What a fucking day! :(";
        Response response = new Response();
        response.responseSTR = "";

        FilterChain fc = new FilterChain();
        fc.addFilter(new SensitiveWordFilter())
          .addFilter(new StopWordFilter())
          .addFilter(new FaceFilter());

        fc.dofilter(request,response,fc);
        System.out.println(request.requestSTR);
        System.out.println(response.responseSTR);

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端技术搭建拼图小游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了俄罗斯方块游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成一个拼图游戏&#xff0c;功能也比较简单简单&#xff…

chatgpt赋能python:Python数组:如何使用Python将数据存入数组中

Python数组&#xff1a;如何使用Python将数据存入数组中 Python是一个非常强大的高级编程语言&#xff0c;在人工智能、数据科学和机器学习等领域有广泛应用。Python允许将数据存储在不同的数据结构中&#xff0c;其中&#xff0c;数组是最常用的。 在这篇文章中&#xff0c;…

卡尔曼滤波与组合导航原理(一)滤波的基本概念、递推最小二乘

文章目录 一、滤波的基本概念1、传统数字滤波器2、现代控制中的状态观测器3、最优估计的含义4、温度估计的例子1.问题描述2.分析 二、递推最小二乘 课程链接&#xff1a;https://www.bilibili.com/video/BV11K411J7gp/?p1 参考书目&#xff1a;《捷联惯导算法与组合导航原理》…

微信小程序nodejs+vue+uniapp大学体育场馆场地预约系统

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 本文以nodejs为开发技术&#xff0c;一开始&#xff0c;本文就对系统内谈到的基本知识&#xff0c;从整体上进行了描述&#xff0c…

人事管理项目-部门数据删除

人事管理项目-部门数据删除 后端实现前端实现 Spring Boot是一个框架&#xff0c;一种全新的编程规范&#xff0c;它的产生简化了框架的使用&#xff0c;所谓简化是指简化了Spring众多框架中所需的大量且烦琐的配置文件&#xff0c;所以Spring Boot是一个服务于框架的框架&…

Netty之Channel解读

目录 channel 的主要作用 ChannelFuture CloseFuture 为什么要异步关闭 channel 的主要作用 close() 可以用来关闭 channelcloseFuture() 用来处理 channel 的关闭 sync 方法作用是同步等待 channel 关闭而 addListener 方法是异步等待 channel 关闭pipeline() 方法添加处理…

使用CodeAnt查找并修复IDE中的开源漏洞与许可证合规问题

不断加快的开发步伐正在将软件安全的责任转移到开发人员的桌面上&#xff0c;但是处理在下游构建和测试中检测到的安全问题可能是非常具有破坏性的。直至报告漏洞的时候&#xff0c;开发人员已经转移到他们的下一个任务。为了修复问题&#xff0c;他们必须中断正在做的事情&…

【OpenAI】Python:基于 Gym-CarRacing 的自动驾驶项目(4) | 车辆控制功能的实现

猛戳&#xff01;跟哥们一起玩蛇啊 &#x1f449; 《一起玩蛇》&#x1f40d; ​ &#x1f4ad; 写在前面&#xff1a;本篇是关于多伦多大学自动驾驶专业项目的博客。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物…

Faiss PQ 乘积量化

Approximate Nearest Neighbor搜索简称ANN。 从宏观上看ANN brute-force搜索的方式是在全空间进行搜索&#xff0c;为了加快查找的速度&#xff0c;几乎所有的ANN方法都是通过对全空间分割&#xff0c;将其分割成很多小的子空间&#xff0c;在搜索的时候&#xff0c;通过某种…

爬虫分布式爬虫部署知识详解

分布式爬虫是指将一个爬虫任务分解成多个子任务&#xff0c;由多个爬虫节点同时执行&#xff0c;以提高爬取效率和速度的一种爬虫方式。下面是分布式爬虫部署的详细步骤&#xff1a; 确定爬虫任务&#xff1a;首先需要确定要爬取的网站和数据&#xff0c;以及需要爬取的频率和深…

公牛33W车充评测 | 拓尔微 IM2403+TMI3451快充方案实力在线

本期嘉宾是我们的老熟人 公牛PD 33W的车载充电器&#xff0c;此前我们对其进行过拆解&#xff0c;那它的充电表现和各方面性能到底如何呢&#xff1f; 下面我们将围绕协议测试、供电方案和产品测试展开评测解读&#xff0c;帮助小伙伴们全方位了解这款1A1C双口快充车充及相应的…

maven私服搭建详细教程(看完必会)

目录 1 为什么需要私服 2 Nexus私服 2.1 Nexus下载及登录 2.2 maven仓库 2.2.1 代理仓库 2.2.2 宿主仓库 2.2.3 仓库组 3 本地Maven下载构建 3.1 pom.xml方式 3.2 镜像方式 4 本地依赖发布到私服 4.1 maven部署到nexus私服 4.1.1 快照版本 ​4.1.2 release版本 4.2 …

Jar包下载失败的解决方案

Jar包下载失败的解决方案 &#x1f50e;配置阿里源&#x1f50e;重新下载Jar包&#x1f50e;结尾 &#x1f50e;配置阿里源 点击 Settings 搜索 Maven 进行如下修改 注意&#x1f36d; User settings file 路径与 Local repository 路径中应尽量避免出现中文 搜索 User setti…

如何提高高层住宅的消防安全性?安科瑞 许敏

1高层住宅消防安全隐患特点 根据我国对高层住宅的规定&#xff0c;建筑高度大于54m的住宅建筑&#xff08;包括设置商业服务网点的住宅建筑&#xff09;为一类高层住宅建筑&#xff0c;建筑高度大于27m&#xff0c;但不大于54m的住宅建筑&#xff08;包括设置商业服务网点的住宅…

JAVA代码程序如何调用电商API,获取电商数据?

电商API是为了实现各个电商平台之间数据交换而提供的网络接口。Java是一种流行的编程语言&#xff0c;可以通过调用API来获得电商平台提供的各种服务&#xff0c;如商品列表、订单状态等。在这篇文章中&#xff0c;我们将详细介绍如何使用Java代码调用电商API。 1.寻找电商平台…

Python:Proportional Odds Model (POM)序分类比例几率模型

Github上你找不到 Logistic 函数求导看这里

责任链实战场景剖析、以及手写责任链

前言&#xff1a; 最早接触责任链这个设计模式&#xff0c;是我老早前看 Spring Aop 的源码的时候&#xff0c;Aop 的原理是遍历一根按照顺序装载好的 Advice&#xff08;通知&#xff09;拦截器链条&#xff0c;使Before、After 这些 Advice&#xff08;通知&#xff09;中的逻…

Accountill 使用 MongoDB、Express、React 和 Nodejs (MERN) 制作的全栈开源发票应用程序

Accountill 使用 MongoDB、Express、React 和 Nodejs (MERN) 制作的全栈开源发票应用程序。 介绍 使用 MERN 堆栈&#xff08;MongoDB、Express、React 和 Nodejs&#xff09;制作的全栈发票应用程序&#xff0c;专为自由职业者和小型企业设计&#xff0c;几乎可用于任何类型的…

职场中有哪些不成熟的表现

(点击即可收听) 大家好,这里是人人领读,今天给大家分享的,职场中有哪些不成熟的表现,希望能给大家带来一些启发. 1. 不主动汇报自己的工作进度 这个在职场当中,是非常忌讳的,一定要积极反馈,不能闷声憋着,说什么自己社恐,不敢跟上级领导交流,害怕被说 自己被分配的任务做到哪个…

仙人掌之歌——权力的游戏(4)

技术大培训 周一上午&#xff0c;陈速在工位上有些坐立不安&#xff0c;他也不知道自己在等待着什么。脑子里不可遏止地又想起上周五时&#xff0c;易伟成过来找自己说的那些没头没脑的话。易伟成先是询问直播串的参数细节&#xff0c;因为他要设计播放串加密方案&#xff0c;…