责任链模式和装饰器模式

1.6 责任链模式

使用场景:例如在论坛上发表文章上传到服务器,我们要进行脱敏,检查是否有黑客代码等,需要进行过滤。如果过滤都写在一块,一方面不方便扩展,一方面代码臃肿(有可能每一种过滤的代码特别多)

public static void main(String[] args) {
    Msg msg = new Msg();
    
    msg.setMsg("大家好,<script> , 欢迎来到我的网站,大家都是hapi");
    List<Filter> filters = new ArrayList<>();
    filters.add(new HTMLFilter());
    filters.add(new SensitiveFilter());
    
    // 责任链里面的所有方法都需要处理过滤操作
    for(Filter f : filters) {
        f.doFilter(msg);
    }
}

interface Filter{
    void doFilter(String msg);
}

class HTMLFilter inplaments Filter{
    void doFilter(String msg) {
        // TODO
    }
}

class SensitiveFilter inplaments Filter{
    void doFilter(String msg) {
        // TODO
    }
}

最终达到这种效果:msg -> filter1 -> filter2 -> DB
最终的责任链:

class FilterChain{
    List<Filter> filters = new ArrayList<>();
    
    // 增加链条
    public void add(Filter filter){
        filters.add(f);
    }
    
    // 进行链式过滤
    public void doFilter(Msg m){
        for(Filter f : filters) {
            f.doFilter(m);
        }
    }
}
  • 定义自己不同的Filter,链接成链过滤

1.7 装饰器模式-Decorator

1.7.1 传统方式替代方案

  • 如果不了解装饰器模式,那么要在原有东西上面加装饰,直观上就是继承,比如美国人继承人,黑色美国人继承美国人等,大量的继承人会产生类爆炸
  • 装饰器模式常被用在图形界面的解决方案中,例如把某个东西加点样式等

1.7.2 装饰器模式解决方案

装饰器模式,就是例如在原有的东西上面加装饰:

  1. PersonDecorator类中添加Person属性
Public class PerionDecorator {
    Persion p;
    public Person getPerson {
        p = new Person();
        // 增加装饰
        p.setColor();
        return p;
    }
}
posted @ 2020-04-14 00:30  x1aoda1  阅读(1335)  评论(0编辑  收藏  举报