• java常见的设置模式(下)


    java常见的设置模式(下)


    ⭐经上期我们了解了 (工厂模式(鸭子工厂、抽象工厂)、和单列模式(懒汉模式、饥饿模式))

    这期我们了解 (责任链、观察者模式、敏感字体过滤器)

    • 责任链模式

    概念:

    责任链模式是一个对象的行为模式,很多对象之间形成一条链条,处理请求在这个链条上进行传递,直到责任链的上的某个对象决定处理请求(也可扩展为几个对象处理),这个过程对于用户来说是透明的,也就是说用户并不需要知道是责任链上的哪个对象处理的请求,对请求是否处理由链条上的对象自己决定。

    简单理解我们可以想象一下击鼓传花的游戏

    使用场景:

    web容器中的过滤器算是责任链模式的一个经典场景。另外举个例子:当在论坛上提交内容时,论坛系统需要对一些关键词进行处理,看看有没有包含一些敏感词汇,而这些敏感词汇我们可以使用责任链模式进行处理。

    类图:

    在这里插入图片描述

    • 观察者模式(Obsever)

    概念:

    观察者模式是对象的行为模式,有时也称为“发布/订阅模式”或者“监听器模式”。

    观察者模式定义了观察者和被观察者之间的一点多的关系,让多个观察者对象可以响应一个被观察者对象。

    使用场景:

    比较经典的使用场景,比如:java中的swing包中对事件的处理。浏览器对鼠标,键盘等事件的处理等, spring中的事件发布机制也是使用该模式。

    类图:

    在这里插入图片描述

    ⭐观察者模式是使用的非常广泛,比如:Listener,Hook,Callback等等,其实都是观察者的一种应用,名称叫法不同而已,思路基本相同

    • 过滤器

      CheckSyntaxFiler类(对语法结构进行检查 当语法中出现了“<”、“>”则替换成"#")
    package com.binbin.com;
    
    public class CheckSyntaxFiler implements Filter{
    
    	 
        public void doFilter(Message message) {
            String content = message.getContent();
            content = content.replace("<", "#");
            content = content.replace(">", "#");
           message.setContent(content);
           
        }
     
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    Filter接口
    package com.binbin.com;
    
    /**
     * Filter接口,实际上是对变化的抽象
     * 这种方式会逐个的运行Filter,但不能
     * 指定是否需要继续执行后面的Filter。
     * 比如:当发现违法了特殊符号的Filter时
     * 其后的过滤链没有必要执行
     */
    
    public interface Filter {
    	 void doFilter(Message message);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    FilterChain类(过滤器链)
    package com.binbin.com;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class FilterChain {
    
        private FilterChain(){}
        
        private static List<Filter> filters = new ArrayList<>();
     
        private static FilterChain instance = new FilterChain();
     
        public static FilterChain getInstance(){
            return instance;
        }
     
        public FilterChain add(Filter filter) {
            filters.add(filter);
            return this;
        }
     
        public Message dofilters(final Message message) {
            for (Filter f : filters) {
                f.doFilter(message);
            }
            return message;
    
    
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    WordFilter(敏感词的过滤)

    当语法中出现 “妈”这个字 则替换成“*”

    package com.binbin.com;
    
    public class WordFilter implements Filter{
    
        public void doFilter(Message message) {
            String content = message.getContent();
            content = content.replace("妈", "*");
           
            message.setContent(content);
        }
    
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    Message实体类
    package com.binbin.com;
    
    public class Message {
    private String content;
    
    public String getContent() {
    	return content;
    }
    
    public void setContent(String content) {
    	this.content = content;
    }
    
    public Message(String content) {
    	super();
    	this.content = content;
    }
    
    @Override
    public String toString() {
    	return "Message [content=" + content + "]";
    }
    public Message() {
    	// TODO Auto-generated constructor stub
    }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    Main测试类
    package com.binbin.com;
    
    public class Main {
    
    
     
        public static void main(String[] args) {
           Message msg = new Message();
            msg.setContent("hello, <abc>, 他妈的, 哈哈哈");
            FilterChain fc = FilterChain.getInstance();
            fc.add(new CheckSyntaxFiler())
                    .add(new WordFilter())
                    .dofilters(msg);
     
            System.out.println(msg.getContent());
        }
    
    	
     
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    输出结果 (如图)

    在这里插入图片描述

  • 相关阅读:
    CentOS/RHEL7环境下更改网卡名称为CentOS6的传统命名规则
    Redis核心数据结构实战与高性能解析
    Mysql相关的各种类型文件
    Databend 开源周报第 111 期
    官网安装Python包太慢?教你三种Pytorch的下载安装方式,保证你再也不用出现Error
    计算机是怎么跑起来的?从零开始手动组装微型计算机
    ExceptionLess的安装、配置、使用
    通过kibana查看索引的mapping(类似于mysql的表结构)
    淘宝二面:MySQL里有2000万条数据,但是Redis中只存20万的数据,如何保证redis中的数据都是热点数据?
    MYSQL运维篇(已完结)
  • 原文地址:https://blog.csdn.net/qq_63130170/article/details/125409184