背景:
一个人出去约会,给这个人添加一些装饰如穿什么样的上衣、下衣、领带、鞋子等等。
装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
UML类图:
被装饰的具体对象Person类:
1 public class Person {
2
3 private String name;
4
5 public Person() {
6 }
7
8 public Person(String name) {
9 this.name = name;
10 }
11
12 public void show(){
13 System.out.println(" 装饰的" + name);
14 }
15 }
抽象的装饰器类Decorate:
1 public class Decorate extends Person {
2
3 protected Person component;
4
5 public void decorate(Person person){
6 this.component = person;
7 }
8
9 @Override
10 public void show() {
11 if(component != null){
12 component.show();
13 }
14 }
15 }
装饰器A DecorateA:
1 public class DecorateA extends Decorate {
2
3 @Override
4 public void show() {
5 System.out.println("装饰A");
6 super.show();
7 }
8 }
装饰器B DecorateB:
1 public class DecorateB extends Decorate {
2
3 @Override
4 public void show() {
5 System.out.println("装饰B");
6 super.show();
7 }
8 }
测试类:
1 public class Main {
2
3 public static void main(String[] args) {
4 System.out.println("Hello World!");
5 Person person = new Person("David");
6 Decorate decorateA = new DecorateA();
7 Decorate decorateB = new DecorateB();
8 decorateA.decorate(person);
9 decorateB.decorate(decorateA);
10 decorateB.show();
11 }
12 }
总结:
在起初的设计中,当系统需要新功能额时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,但是这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。而装饰模式却提供了一个非常好的解决方案,它吧每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的、按顺序的使用装饰功能包装对象了。
典型应用是JDK中的IO操作。