结构图
代码
1package com.elltor.designpattern.decorate;
2
3public interface Component {
4 void operate();
5}
1package com.elltor.designpattern.decorate;
2
3public class ConcreteComponent implements Component {
4 @Override
5 public void operate() {
6 System.out.println("ConcreteComponent operate....(origin)");
7 }
8}
1package com.elltor.designpattern.decorate;
2
3public class Decorator implements Component {
4 protected Component component;
5
6 public void setComponent(Component component){
7 this.component=component;
8 }
9
10
11 @Override
12 public void operate() {
13 if(this.component!=null){
14 component.operate();
15 }
16 }
17}
1package com.elltor.designpattern.decorate;
2
3public class Decorator implements Component {
4 protected Component component;
5
6 public void setComponent(Component component){
7 this.component=component;
8 }
9
10
11 @Override
12 public void operate() {
13 if(this.component!=null){
14 component.operate();
15 }
16 }
17}
1package com.elltor.designpattern.decorate;
2
3public class ConcreteDecoratorA extends Decorator {
4 String info = "ConcreteDecoratorA";
5
6
7 // 并不太好
8 @Override
9 public void operate() {
10 super.operate();
11 System.out.println("装饰一下..............");
12 System.out.println("info: "+info);
13 }
14}
1package com.elltor.designpattern.decorate;
2
3
4public class ConcreteDecoratorB extends Decorator {
5 String info = "ConcreteDecoratorB";
6
7 @Override
8 public void operate() {
9 super.operate();
10 System.out.println("装饰一下..............");
11 System.out.println("info: "+info);
12 }
13}
1package com.elltor.designpattern.decorate;
2
3public class Main {
4
5 public static void main(String[] args) {
6 ConcreteComponent cc = new ConcreteComponent();
7 System.out.println("未装饰前");
8 cc.operate();
9
10 System.out.println("\n--------------------");
11
12 System.out.println("A装饰后");
13 ConcreteDecoratorA A = new ConcreteDecoratorA();
14 A.setComponent(cc);
15 A.operate();
16
17 System.out.println("\n--------------------");
18 System.out.println("B装饰后");
19 ConcreteDecoratorA B = new ConcreteDecoratorA();
20 B.setComponent(cc);
21 B.operate();
22 }
23}
24
25//运行结果
26未装饰前
27ConcreteComponent operate....(origin)
28
29--------------------
30A装饰后
31ConcreteComponent operate....(origin)
32装饰一下..............
33info: ConcreteDecoratorA
34
35--------------------
36B装饰后
37ConcreteComponent operate....(origin)
38装饰一下..............
39info: ConcreteDecoratorA
如果一个类型的功能被代理的多了也就说明该类的需要重构了, 过多的使用装饰器会使类比较臃肿。