装饰者模式

来源:互联网 发布:数据公司 30亿 收购 编辑:程序博客网 时间:2024/06/06 01:11

装饰者模式其实跟责任链是有类似的地方的,就我个人目前的理解来说,两者的区别主要有以下方面:

责任链-- 最简单直接的责任链的实现就是拦截器了,那么功能上也如拦截,是针对数据的层层校验。

装饰者-- 这个层次上会复杂一些,主要分为三层的结构

第一层 共性接口

所有的实现类都应该遵循公共接口的规范;

第二层 功能类

也可以说是一个模块,我们知道一个功能的实现是要依赖其他的一些规则来实现的,那么下面是具体的规则的实现;

第三层 规则类

类似衣服或者积木之类的,往功能类上进行拼接,达到在毛坯房上不停的装修的效果。


第一层 共性接口 下面的第二层和第三层都是要实现这个抽象类的

public abstract class Rule {private String ruleName;public void setRuleName(String ruleName) {this.ruleName = ruleName;}@Overridepublic String toString() {return ruleName;}abstract void filter();}

第二层 功能类 具体就是某个类了

public class Forum extends Rule {@Overridevoid filter() {System.out.println(toString());}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "系统模块开始";}}


第三层 规则类

public class Abuse extends Rule {private Rule rule; public void decorate(Rule rule) {this.rule = rule;}@Overridevoid filter() {if (rule != null) {rule.filter();}System.out.println(toString());}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "辱骂语言过滤";}}

public class AntiCountry extends Rule {private Rule rule; public void decorate(Rule rule) {this.rule = rule;}@Overridevoid filter() {if (rule != null) {rule.filter();}System.out.println(toString());}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "反动词语过滤";}}

最后的调用

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();}}

输出结果

系统模块开始
辱骂语言过滤
反动词语过滤


总结:

从执行的结果大概可以看出,装饰者的每个功能的类的执行顺序是从下往上,而责任链则是从上往下;

个人认为两个都是相同的链式传递,在大部分的情况下能够互相实现(目前未想到有什么不能互相转换的情况)


0 0
原创粉丝点击