【设计模式-05】Facade门面Mediator调停者 | Decorator装饰器 | Chain Of Responsibility责任链

news2024/11/16 3:21:07

Facade门面Mediator调停者

1、Facade门面图解

2、Mediator调停者

一般是系统内部相互交错,比如消息中间件(MQ)就是这种设计模式,对各个功能或系统之间进行解耦。


 Decorator装饰器

1、问题

2、解决方案


Chain Of Responsibility责任链

一、例子场景

业务场景:论坛或者博客发表帖子或者评论,对敏感词过滤处理。使用责任链的模式进行过滤处理。

二、没有使用设计模式之前

/**
* @description: 责任链模式
* @author: flygo
* @time: 2022/7/18 09:51
*/
public class CorMain {
    
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("大家好:), <script> 欢迎访问 baidu.com,大家都是996");
        
        // 处理msg
        String r = msg.getMsg();
        r = r.replace('<', '[');
        r = r.replace('>', ']');
        msg.setMsg(r);
        
        r = r.replaceAll("996", "955");
        msg.setMsg(r);
        
        System.out.println(msg);
    }
}

class Msg {
    String name;
    String msg;
    
    public String getMsg() {
        return msg;
    }
    
    public void setMsg(String msg) {
        this.msg = msg;
    }
    
    @Override
    public String toString() {
        return "Msg{" + "msg='" + msg + '\'' + '}';
    }
}

二、使用Filter封装处理

把变化的进行封装处理

/**
 * @description: 责任链模式
 * @author: flygo
 * @time: 2022/7/18 09:51
 */
public class CorMain {

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

    // 处理msg
    new HTMLFilter().doFilter(msg);
    new SensitiveFilter().doFilter(msg);

    System.out.println(msg);
  }
}

class Msg {
  String name;
  String msg;

  public String getMsg() {
    return msg;
  }

  public void setMsg(String msg) {
    this.msg = msg;
  }

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

interface Filter {
  void doFilter(Msg m);
}

class HTMLFilter implements Filter {

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

class SensitiveFilter implements Filter {

  @Override
  public void doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();

    r = r.replaceAll("996", "955");
    m.setMsg(r);
  }
}

三、使用Filter封装的串在一起

核心代码实现

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

/**
 * @description: 责任链模式
 * @author: flygo
 * @time: 2022/7/18 09:51
 */
public class CorMain {

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

    List<Filter> filterList = new ArrayList<>();
    filterList.add(new HTMLFilter());
    filterList.add(new SensitiveFilter());

    for (Filter f : filterList) {
      f.doFilter(msg);
    }

    System.out.println(msg);
  }
}

class Msg {
  String name;
  String msg;

  public String getMsg() {
    return msg;
  }

  public void setMsg(String msg) {
    this.msg = msg;
  }

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

interface Filter {
  void doFilter(Msg m);
}

class HTMLFilter implements Filter {

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

class SensitiveFilter implements Filter {

  @Override
  public void doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();

    r = r.replaceAll("996", "955");
    m.setMsg(r);
  }
}

四、使用Filter链条串一起

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

/**
 * @description: 责任链模式
 * @author: flygo
 * @time: 2022/7/18 09:51
 */
public class CorMain {

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

    FilterChain filterChain = new FilterChain();
    filterChain.add(new HTMLFilter());
    filterChain.add(new SensitiveFilter());

    filterChain.doFilter(msg);

    System.out.println(msg);
  }
}

class Msg {
  String name;
  String msg;

  public String getMsg() {
    return msg;
  }

  public void setMsg(String msg) {
    this.msg = msg;
  }

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

interface Filter {
  void doFilter(Msg m);
}

class HTMLFilter implements Filter {

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

class SensitiveFilter implements Filter {

  @Override
  public void doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();

    r = r.replaceAll("996", "955");
    m.setMsg(r);
  }
}

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

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

  public void doFilter(Msg m) {
    for (Filter f : filterList) {
      f.doFilter(m);
    }
  }
}

五、两个链条串一起

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

/**
 * @description: 责任链模式
 * @author: flygo
 * @time: 2022/7/18 09:51
 */
public class CorMain {

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

    FilterChain filterChain1 = new FilterChain();
    filterChain1.add(new HTMLFilter()).add(new SensitiveFilter());

    FilterChain filterChain2 = new FilterChain();
    filterChain2.add(new FaceFilter()).add(new URLFilter());

    filterChain1.add(filterChain2);

    filterChain1.doFilter(msg);

    System.out.println(msg);
  }
}

class Msg {
  String name;
  String msg;

  public String getMsg() {
    return msg;
  }

  public void setMsg(String msg) {
    this.msg = msg;
  }

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

interface Filter {
  void doFilter(Msg m);
}

class HTMLFilter implements Filter {

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

class SensitiveFilter implements Filter {

  @Override
  public void doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();

    r = r.replaceAll("996", "955");
    m.setMsg(r);
  }
}

class FaceFilter implements Filter {

  @Override
  public void doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();
    r = r.replace(":)", "^v^");
    m.setMsg(r);
  }
}

class URLFilter implements Filter {

  @Override
  public void doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();
    r = r.replace("baidu.com", "https://www.baidu.com");
    m.setMsg(r);
  }
}

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

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

  @Override
  public void doFilter(Msg m) {
    for (Filter f : filterList) {
      f.doFilter(m);
    }
  }
}

六、由FilterChain中的某一个Filter决定链条是否继续

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

/**
 * @description: 责任链模式
 * @author: flygo
 * @time: 2022/7/18 09:51
 */
public class CorMain {

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

    FilterChain filterChain1 = new FilterChain();
    filterChain1.add(new HTMLFilter()).add(new SensitiveFilter());

    FilterChain filterChain2 = new FilterChain();
    filterChain2.add(new FaceFilter()).add(new URLFilter());

    filterChain1.add(filterChain2);

    filterChain1.doFilter(msg);

    System.out.println(msg);
  }
}

class Msg {
  String name;
  String msg;

  public String getMsg() {
    return msg;
  }

  public void setMsg(String msg) {
    this.msg = msg;
  }

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

interface Filter {
  boolean doFilter(Msg m);
}

class HTMLFilter implements Filter {

  @Override
  public boolean doFilter(Msg m) {
    String r = m.getMsg();
    r = r.replace('<', '[');
    r = r.replace('>', ']');
    m.setMsg(r);

    return true;
  }
}

class SensitiveFilter implements Filter {

  @Override
  public boolean doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();
    r = r.replaceAll("996", "955");
    m.setMsg(r);

    return false;
  }
}

class FaceFilter implements Filter {

  @Override
  public boolean doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();
    r = r.replace(":)", "^v^");
    m.setMsg(r);
    return true;
  }
}

class URLFilter implements Filter {

  @Override
  public boolean doFilter(Msg m) {
    // 处理msg
    String r = m.getMsg();
    r = r.replace("baidu.com", "https://www.baidu.com");
    m.setMsg(r);
    return true;
  }
}

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

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

  @Override
  public boolean doFilter(Msg m) {
    for (Filter f : filterList) {
      if (!f.doFilter(m)) {
        return false;
      }
    }
    return false;
  }
}

七、模拟Java中的ServletFilter 和FilterChain实现

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

/**
 * @description: 责任链模式
 * @author: flygo
 * @time: 2022/7/18 09:51
 */
public class ServletMain {

  public static void main(String[] args) {
    Request request = new Request();
    request.str = "大家好:), <script> 欢迎访问 baidu.com,大家都是996";

    Response response = new Response();
    response.str = "response";

    FilterChain filterChain = new FilterChain();
    filterChain.add(new HTMLFilter()).add(new SensitiveFilter());

    filterChain.doFilter(request, response);

    System.out.println(request.str);
    System.out.println(response.str);
  }
}

class Request {
  String str;
}

class Response {
  String str;
}

interface Filter {
  boolean doFilter(Request request, Response response, FilterChain chain);
}

class HTMLFilter implements Filter {

  @Override
  public boolean doFilter(Request request, Response response, FilterChain chain) {
    request.str = request.str.replaceAll("<", "[").replaceAll(">", "]") + "----HTMLFilter";
    chain.doFilter(request, response);
    response.str += "----HTMLFilter";
    return true;
  }
}

class SensitiveFilter implements Filter {

  @Override
  public boolean doFilter(Request request, Response response, FilterChain chain) {
    request.str = request.str.replaceAll("996", "955") + "----SensitiveFilter";
    chain.doFilter(request, response);
    response.str += "----SensitiveFilter";
    return true;
  }
}

class FilterChain {
  List<Filter> filterList = new ArrayList<>();
  int index = 0;

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

  public boolean doFilter(Request request, Response response) {
    if (filterList.size() == index) {
      return false;
    }
    Filter f = filterList.get(index);
    index++;

    return f.doFilter(request, response, this);
  }
}

八、源码地址

GitHub - jxaufang168/Design-Patterns: 设计模式学习设计模式学习. Contribute to jxaufang168/Design-Patterns development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/jxaufang168/Design-Patterns


 

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

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

相关文章

(Java企业 / 公司项目)JMeter接口压测使用(保姆式手把手教会)

一. JMeter简介认识&#xff08;重点是下面的使用方法&#xff09; JMeter是一个开源的Java应用程序&#xff0c;由Apache软件基金会开发和维护&#xff0c;可用于性能测试、压力测试、接口测试等。 1. 原理 JMeter的基本原理是模拟多用户并发访问应用程序&#xff0c;通过发…

手把手教你如何搭建Spring本地编译环境

大家好&#xff0c;我是极客涛&#xff0c;不知道小伙伴有没有和我一样的情况&#xff0c;在阅读Spring源码时&#xff0c;只通过静态的代码阅读很难有更深刻的理解&#xff0c;所以建议通过写测试类进行debug的方式&#xff0c;对核心的代码进行运行时的状态调试&#xff0c;这…

2024年腾讯云服务器活动价格整理汇总,5年和三年选择

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

TLS握手流程分析

1.SSL/TLS 历史 HTTP 是明文传输的协议&#xff0c;可能受到第三方的攻击&#xff0c;非常不安全。因此才诞生 “HTTPS”。 这个 “S” 表示 SSL/TLS 协议&#xff0c;用公式说明&#xff1a;HTTPS HTTP SSL(TLS)。 其中 SSL 即安全套接层&#xff08;Secure Sockets Layer&…

【开发篇】四、MAT堆内存分析(Memory Analyzer Tool)

文章目录 1、使用2、报错3、MAT支配树4、MAT内存泄漏的检测原理5、导出运行中系统的内存快照6、补充 1、使用 内存溢出后&#xff0c;分析泄露的思路是&#xff1a; 在OOM前&#xff0c;将整个堆内存保存成一个hprof文件MAT打开hprof文件&#xff0c;MAT自行分析可疑对象 添…

模拟器安装XPosed框架教程

Xposed框架下载&#xff08;搞不懂就先看完本篇教程再下载&#xff09; 99%的情况只需要下载里面的XPosed鸭就行了 安卓8及以下XPosed框架 - 多开鸭模拟器安装XPosed框架图文视频教程 关于本站XPosed框架的说明 XPosed框架(即XP框架)&#xff0c;由rovo89开发。适用于安卓7以…

Kafka消费流程

Kafka消费流程 消息是如何被消费者消费掉的。其中最核心的有以下内容。 1、多线程安全问题 2、群组协调 3、分区再均衡 1.多线程安全问题 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的。 对于线程安全&…

HNU-算法设计与分析-实验4

算法设计与分析实验4 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验41 回溯算法求解0-1背包问题问题重述想法代码验证算法分析 2 回溯算法实现题5-4运动员最佳配对问题问题重述想法代码验证算法分析 3 分支限界法求解0-1背包问题问题重述想法…

OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds)

1.简介 本博客以.glb格式为例&#xff0c;加载glb格式的3d模型&#xff0c;网上找了一圈&#xff0c;基本上都是根据OpenGL官方示例&#xff0c;加载.obj格式的3d模型。 下面以.obj和.glb格式的3D模型简单介绍一下。 常见的.obj格式的3D模型如下所示&#xff1a;纹理都已经被…

FineBI实战项目一(23):订单商品分类词云图分析开发

点击新建组件&#xff0c;创建订单商品分类词云图组件。 选择词云&#xff0c;拖拽catName到颜色和文本&#xff0c;拖拽cat到大小。 将组件拖拽到仪表板。 结果如下&#xff1a;

MYSQL的学习——单行函数详解

目录 1. 数值函数 1) 基本函数 2) 角度与弧度互换函数 3) 三角函数 4) 指数与对数函数 5) 进制间的转换 2. 字符串函数 3. 日期和时间函数 1) 获取日期、时间 2) 日期与时间戳的转换 3) 获取月份、星期、星期数、天数等函数 4) 日期的操作函数 5) 时间和秒钟转换的…

商业世界,从2023到2024

作者&#xff5c;潮汐商业评论 编辑&#xff5c;Ray 变化总在发生&#xff0c;你不去迎接进步的变化&#xff0c;就会等到退步的变化。 —— 查理.芒格 2023, 我们似乎总在不断告别。从“一生自由”的大家黄永玉到“智慧”投资家查理.芒格&#xff0c;再到写出《不能承受的生命…

条款24:若所有参数皆需类型转换,请为此采用非成员函数

设计一个表示有理数的类时&#xff0c;允许从整数隐式转换为有理数是有用的&#xff1a; class Rational { public:Rational(int numerator 0, // 该构造函数没有explicit限制;int denominator 1); int numerator() const; int denominator() const; const Rational opera…

如何用GPT制作PPT和写代码?

详情点击链接&#xff1a;如何用GPT制作PPT和写模型代码&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定…

04.SpringCloud网关-gateway

1.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

系统环境&#xff1a;Win10家庭中文版 Qt : 5.12.9 链接了一些64位的第三方库&#xff0c;程序编译完运行后出现 qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" 弹窗如下&#xff1a; 网上搜了一些都是关于pyQt的&#xff0c…

基于Python+Django,我搭建一个视频点播平台

学习过程中&#xff0c;遇到问题可以咨询作者 功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括&#xff1a;首页、视频列表页面、视频详情页、用户中心模…

国际版WPS Office 18.6.1

【应用名称】&#xff1a;WPS Office 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#WPS 【应用版本】&#xff1a;18.6.1 【应用大小】&#xff1a;160MB 【软件说明】&#xff1a;软件日常更新。WPS Office是使用人数最多的移动办公软件。独有手机阅读模式…

MR-GCN

∘ Φ \circ_Φ ∘Φ​ denotes a convolution Let b l o c k d i a g blockdiag blockdiag(A) be a n1n3-by-n2n3 block diagonal matrix&#xff0c; f o l d fold fold indicate its inverse operator diagonal degree tensor D \mathcal{D} D 作者未提供代码

科教文汇期刊怎么投稿?

《科教文汇》系国家新闻出版署认定的第一批学术期刊&#xff0c;主要刊登教育领域有创新性、学术性和实用性&#xff0c;有较高学术价值的论文。本刊由顾问、名誉社长、主任编委及编委组成学术审读团体&#xff0c;注重教研教改成果的宣传、案例的分析、经验的介绍及学术的交流…