大话设计模式之装饰器模式
背景:
一个人出去约会,给这个人添加一些装饰如穿什么样的上衣、下衣、领带、鞋子等等。
装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
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操作。