设计模式

224 阅读1分钟

image.png

代理模式

  • 通过引入一个代理对象来实现对目标对象的功能增强,Spring Aop就是动态代理
  • 相关文章:juejin.cn/post/743643…

单例模式

懒加载
public class Singleton {
    private static Singleton singleton;
    
    private Singleton() {}
    
    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}
立即加载
public class Singleton {  
    private static Singleton instance = new Singleton();
    
    private Singleton (){}  
    
    public static Singleton getInstance() {  
    	return instance;  
    }  
}

责任链模式

  • 将处理某个请求的对象通过数组或链表串联在一起,让这些对象依次处理这个请求

  • 过滤敏感词案例:

    public class ApplicationDemo {
        public static void main(String[] args) {
            FilterChain chain = new FilterChain();
            chain.addFilter(new SexyFilter());
            chain.addFilter(new AdsFilter());
    
            boolean legal = filterChain.doFilter(new Content());
            if (!legal) {
                // 不发表
            } else {
                // 发表
            }
        }
    }
    
    public class FilterChain {
        private List<SensitiveFilter> filters = new ArrayList<>();
    
        public void addFilter(SensitiveFilter filter) {
            this.filters.add(filter);
        }
    
        // return true if content doesn't contain sensitive words.
        public boolean doFilter(Content content) {
            for (SensitiveFilter filter : filters) {
                if (!filter.doFilter(content)) {
                    return false;
                }
            }
            return true;
        }
    }
    
    public interface SensitiveFilter {
        boolean doFilter(Content content);
    }
    
    public class SexyFilter implements SensitiveFilter {
        @Override
        public boolean doFilter(Content content) {
            boolean legal = true;
            //...
            return legal;
        }
    }
    
    public class AdsFilter implements SensitiveFilter {
        @Override
        public boolean doFilter(Content content) {
            boolean legal = true;
            //...
            return legal;
        }
    }