模式意图
在不改变原来类的情况下,进行扩展。
动态的给对象增加一个业务功能,就功能来说,比生成子类更方便。
应用场景
1 在不生成子类的情况下,为对象动态的添加某些操作。
2 处理一些可以撤销的职责。
3 当不能使用生成子类来扩充时。
模式结构
Component 外部接口,用于定义外部调用的形式。提供默认的处理方法。
代码语言:javascript复制interface Component{
public void operation();
}
ConcreteComponent 具体的处理类,用于实现operation方法。
代码语言:javascript复制class ConcreteComponent implements Component{
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("ConcreteComponent operation()");
}
}
Decorator 装饰类,内部关联一个component对象,调用其operation方法,并添加自己的业务操作。
代码语言:javascript复制class Decorator implements Component{
private Component component;
@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("before decorator!");
component.operation();
System.out.println("after decorator!");
}
public Decorator() {
// TODO Auto-generated constructor stub
}
public Decorator(Component component){
this.component = component;
}
}
全部代码
代码语言:javascript复制 1 package com.xingoo.decorator;
2 interface Component{
3 public void operation();
4 }
5 class ConcreteComponent implements Component{
6
7 @Override
8 public void operation() {
9 // TODO Auto-generated method stub
10 System.out.println("ConcreteComponent operation()");
11 }
12
13 }
14 class Decorator implements Component{
15 private Component component;
16 @Override
17 public void operation() {
18 // TODO Auto-generated method stub
19 System.out.println("before decorator!");
20 component.operation();
21 System.out.println("after decorator!");
22 }
23 public Decorator() {
24 // TODO Auto-generated constructor stub
25 }
26 public Decorator(Component component){
27 this.component = component;
28 }
29
30 }
31
32
33 public class test {
34 public static void main(String[] args) {
35 Component component = new Decorator(new ConcreteComponent());
36 component.operation();
37 }
38 }
运行结果
代码语言:javascript复制before decorator!
ConcreteComponent operation()
after decorator!