装饰器设计模式初探及Java中实际应用举例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

装饰器设计模式初探及Java中实际应⽤举例
本篇随笔主要介绍⽤Java实现简单的装饰器设计模式:
先来看⼀下装饰器设计模式的类图:
从图中可以看到,我们可以装饰Component接⼝的任何实现类,⽽这些实现类也包括了装饰器本⾝,装饰器本⾝也可以再被装饰。

下⾯是⽤Java实现的简单的装饰器设计模式,提供的是从基本的加⼊咖啡⼊⼿,可以继续加⼊⽜奶,巧克⼒,糖的装饰器系统。


1interface Component {
2void method();
3 }
4class Coffee implements Component {
5
6 @Override
7public void method() {
8// TODO Auto-generated method stub
9 System.out.println("倒⼊咖啡");
10 }
11
12 }
13class Decorator implements Component {
14public Component comp;
15public Decorator(Component comp) {
p = comp;
17 }
18 @Override
19public void method() {
20// TODO Auto-generated method stub
21 comp.method();
22 }
23
24 }
25class ConcreteDecorateA extends Decorator {
26public Component comp;
27public ConcreteDecorateA(Component comp) {
28super(comp);
p = comp;
30 }
31public void method1() {
32 System.out.println("倒⼊⽜奶");
33 }
34public void method2() {
35 System.out.println("加⼊糖 ");
36 }
37public void method() {
38super.method();
39 method1();
40 method2();
41 }
42 }
43class ConcreteDecorateB extends Decorator {
44public Component comp;
45public ConcreteDecorateB(Component comp) {
46super(comp);
p = comp;
48 }
49public void method1() {
50 System.out.println("加⼊巧克⼒");
51 }
52public void method() {
53super.method();
54 method1();
55 }
56 }
57public class TestDecoratePattern {
58public static void main(String[] args) {
59 Component comp = new Coffee();
60 comp.method();
61 System.out.println("--------------------------------------------------");
62 Component comp1 = new ConcreteDecorateA(comp);
63 comp1.method();
64 System.out.println("--------------------------------------------------");
65 Component comp2 = new ConcreteDecorateB(comp1);
66 comp2.method();
67 System.out.println("--------------------------------------------------");
68 Component comp3 = new ConcreteDecorateB(new ConcreteDecorateA(new Coffee()));
69 comp3.method();
70 System.out.println("--------------------------------------------------");
71 Component comp4 = new ConcreteDecorateA(new ConcreteDecorateB(new Coffee()));
72 comp4.method();
73 }
74 }
运⾏结果:
装饰器设计模式可以使得我们⾃由的,以任意顺序导⼊巧克⼒,⽜奶,咖啡和糖。

可以实现多层,任意顺序的装饰。

Java中实际应⽤举例:
1、java io流
以下⼀句代码即体现了装饰器设计模式的应⽤:
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(new File(filePath), true)));
PrintWriter类及BufferedWriter类就相当于上⾯装饰器设计模式类图中的ConcreteDecorateA 与 ConcreteDecorateB,FileWriter类则相当于上⾯类图中的ConcreteComponent类,PrintWriter类的构造器实际接受的是⼀个Writer类的对象,在这⾥即为BufferedWriter类的对象,然后对这个Writer类的write⽅法进⾏装饰。

2、web应⽤中在filter类中实现⾃定义的输⼊输出
filter类实现如下:
public class AllFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//⾃定义输出流
ServletResponse compressionResponse = new CompressionResponseWrapper((HttpServletResponse) servletResponse);
 //把⾃定义的输出流传递到⽤户实现的servlet中去
filterChain.doFilter(servletRequest, compressionResponse);
}
@Override
public void destroy() {
}
}
其中⾃定义的输出流 CompressionResponseWrapper 类就是装饰器设计模式的⼀个应⽤。

CompressionResponseWrapper类实现如下:
public class CompressionResponseWrapper extends HttpServletResponseWrapper {
private HttpServletResponse response;
public CompressionResponseWrapper(HttpServletResponse response) {
super(response);
this.response = response;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
System.out.println("在这⾥可对输出流进⾏定制操作,例如进⾏压缩,返回压缩后的新的输出流");
return response.getOutputStream();
}
}
这⾥CompressionResponseWrapper类相当于上述装饰器设计模式类图中的ConcreteDecorateA类,HttpServletResponse类则相当于待装饰的接⼝。

CompressionResponseWrapper类还可以再被装饰添加其他功能,这就是装饰器设计模式的强⼤之处。

相关文档
最新文档