责任链模式和装饰器模式
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 装饰器模式解决方案
装饰器模式,就是例如在原有的东西上面加装饰:
- PersonDecorator类中添加Person属性
Public class PerionDecorator {
Persion p;
public Person getPerson {
p = new Person();
// 增加装饰
p.setColor();
return p;
}
}