责任链模式和装饰器模式

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

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 装饰器模式解决方案

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

PersonDecorator类中添加Person属性

Public class PerionDecorator { Persion p; public Person getPerson { p = new Person(); // 增加装饰 p.setColor(); return p; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywgxz.html