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

这篇具有很好参考价值的文章主要介绍了【设计模式-05】Facade门面Mediator调停者 | Decorator装饰器 | Chain Of Responsibility责任链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Facade门面Mediator调停者

1、Facade门面图解

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

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

2、Mediator调停者

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

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


 Decorator装饰器

1、问题

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

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

2、解决方案

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


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封装的串在一起

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

核心代码实现

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

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链条串一起

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

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

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);
    }
  }
}

五、两个链条串一起

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

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

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决定链条是否继续

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

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

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

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实现

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

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

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.https://github.com/jxaufang168/Design-Patterns


 文章来源地址https://www.toymoban.com/news/detail-803512.html

到了这里,关于【设计模式-05】Facade门面Mediator调停者 | Decorator装饰器 | Chain Of Responsibility责任链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式十一:外观模式(Facade Pattern)

    外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中,简化了客户端与子系统之间的交互,使得客户端代码更加清晰、简洁。 外观模式的使用场景包括: 简化

    2024年02月13日
    浏览(32)
  • 设计模式之中介者模式(Mediator)的C++实现

    在软件组件开发过程中,如果存在多个对象,且这些对象之间存在的相互交互的情况不是一一对应的情况,这种功能组件间的对象引用关系比较复杂,耦合度较高。如果有一些新的需求变化,则不易扩展。中介者模式可以解决这种问题。中介者模式使用一个“中介对象”去管

    2024年02月12日
    浏览(24)
  • Java设计模式之门面模式

    门面模式/外观模式 门面模式(Facade),它隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。通过对客户端提供一个统一的接口用于访问子系统中的一群接口。 优缺点: 1、子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统模块进

    2023年04月10日
    浏览(34)
  • 设计模式——1_4 外观(Facade)

    为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 你可以把 外观模式 理解成控制面板,你可能拥有一部庞大的机器,但是为了使用他,你并不需要理解里面每一个螺丝的作用,只需要按照说明书去控制操作面

    2024年01月20日
    浏览(35)
  • 门面设计模式

     github:GitHub - QiuliangLee/pattern: 设计模式 门面设计模式是一种软件设计模式,也被称为外观(Facade)模式。它提供了一个简单的接口,让客户端能够访问复杂系统中的一组接口。通过门面模式,我们可以隐藏系统的复杂性,并提供一个简单的接口来访问系统。此外,门面模式

    2024年02月09日
    浏览(36)
  • 《Java极简设计模式》第08章:外观模式(Facade)

    作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/java-simple-design-facade 沉淀,成长,突破,帮助他人,成就自我。 本章难度:★★☆☆☆ 本章重点:用最

    2024年02月07日
    浏览(33)
  • AI Chat 设计模式:8. 门面(外观)模式

    本文是该系列的第八篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。 门面模式(Facade Pattern)是一种结构型设计模式,它 提供了一个简单的接口,用于统一封装子系统中的一组接口 ,并将其展示给客户端。门

    2024年02月16日
    浏览(28)
  • javascript设计模式-门面和享元

    它的作用有两个,一个是简化类的接口,另一个是消除类与使用它的客户代码之间的耦合。比如基于GUI的操作系统就是计算机的数据和功能的一个门面,每次点击等操作实际上是在跟一个门面打交道,间接地执行一些幕后的命令。 如今的WEB应用程序开发要求必须尽量提高编程

    2024年01月24日
    浏览(32)
  • 创建型设计模式05-抽象工厂模式

    ✨作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,围绕一个超级工厂创建其他工厂,也称作为工厂的工厂(大工厂里的小工厂)。在抽象工厂模式中, 接口负责创建一组相关对

    2024年02月07日
    浏览(30)
  • 【2023-05-09】 设计模式(单例,工厂)

    单例模式 顾名思义,就是整个系统对外提供的实例有且只有一个 特点: ​ 1、单例类只有一个实例 ​ 2、必须是自己创建唯一实例 ​ 3、必须给所以对象提供这个实例 分类:一般分为饿汉式单例(直接实例化)和懒汉式单例(使用时才实例化) 饿汉式单例 懒汉式单例 同步

    2024年02月03日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包