装饰者模式其实跟责任链是有类似的地方的,就我个人目前的理解来说,两者的区别主要有以下方面:
责任链-- 最简单直接的责任链的实现就是拦截器了,那么功能上也如拦截,是针对数据的层层校验。
装饰者-- 这个层次上会复杂一些,主要分为三层的结构
第一层 共性接口
所有的实现类都应该遵循公共接口的规范;
第二层 功能类
也可以说是一个模块,我们知道一个功能的实现是要依赖其他的一些规则来实现的,那么下面是具体的规则的实现;
第三层 规则类
类似衣服或者积木之类的,往功能类上进行拼接,达到在毛坯房上不停的装修的效果。
第一层 共性接口 下面的第二层和第三层都是要实现这个抽象类的
public abstract class Rule {
private String ruleName;
public void setRuleName(String ruleName) {
this.ruleName = ruleName;
}
@Override
public String toString() {
return ruleName;
}
abstract void filter();
}
第二层 功能类 具体就是某个类了
public class Forum extends Rule {
@Override
void filter() {
System.out.println(toString());
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "系统模块开始";
}
}
第三层 规则类
public class Abuse extends Rule {
private Rule rule;
public void decorate(Rule rule) {
this.rule = rule;
}
@Override
void filter() {
if (rule != null) {
rule.filter();
}
System.out.println(toString());
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "辱骂语言过滤";
}
}
public class AntiCountry extends Rule {
private Rule rule;
public void decorate(Rule rule) {
this.rule = rule;
}
@Override
void filter() {
if (rule != null) {
rule.filter();
}
System.out.println(toString());
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "反动词语过滤";
}
}
最后的调用
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Forum forum = new Forum();
Abuse abuse = new Abuse();
AntiCountry antiCountry = new AntiCountry();
abuse.decorate(forum);
antiCountry.decorate(abuse);
antiCountry.filter();
}
}
输出结果
系统模块开始
辱骂语言过滤
反动词语过滤
总结:
从执行的结果大概可以看出,装饰者的每个功能的类的执行顺序是从下往上,而责任链则是从上往下;
个人认为两个都是相同的链式传递,在大部分的情况下能够互相实现(目前未想到有什么不能互相转换的情况)