大话设计模式之装饰器模式

背景:

一个人出去约会,给这个人添加一些装饰如穿什么样的上衣、下衣、领带、鞋子等等。

装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

 

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操作。

 

posted @ 2018-05-27 15:09  浅夏丶未央  阅读(157)  评论(0编辑  收藏