摘要
A Decorator Pattern says that just "attach a flexible additional responsibilities to an object dynamically".
装饰模式的含义就是:“动态地为对象添加一些附加的责任”。换句话说,Decorator模式使用组合而不是继承来在运行时扩展对象的功能。装饰模式也被称为Wrapper-包装器模式。它是继承的一种替代方案。
装饰模式的优点
- 提供了比静态继承更大的灵活性
- 提供了对象更加灵活的扩展性,因为它是通过对新类编码进行扩展
- 它更加的简单。因为它允许在目标类中开发一系列的功能方法来代替在全部的对象中硬编码对象的行为方式
装饰模式使用的场景
- 当需要透明的、动态的为一个对象增加某种服务并且不想影响其他对象的时候
- 当想要添加某种服务到将来可能需要改变的对象上时
- 通过子类扩展很难实现的时候
UML
code 1:Person.java
1 package com.daike.decorator;
2
3 /**
4 * 抽象构件角色 Person
5 * @author daike
6 *
7 */
8 public interface Person {
9
10 public void show ();
11 }
code 2:GenericPerson.java
1 package com.daike.decorator;
2
3 /**
4 * 具体构件角色 GenericPerson
5 * @author daike
6 *
7 */
8 public class GenericPerson implements Person{
9
10 @Override
11 public void show() {
12 System.out.println("一个普通的人。");
13 }
14
15 }
code 3:Tearcher.java
1 package com.daike.decorator;
2
3 /**
4 * 具体装饰角色 Tearcher
5 * @author daike
6 *
7 */
8 public class Tearcher extends Decorator{
9 public Tearcher () {}
10 public Tearcher (Person per) {
11 super(per);
12 }
13
14 @Override
15 public void show() {
16 super.show();
17 System.out.println("我还是一个很厉害的老师!");
18 }
19 }
code 3:Decorator.java
1 package com.daike.decorator;
2
3 /**
4 * 装饰角色 Decorator
5 * @author daike
6 *
7 */
8 public class Decorator implements Person {
9 private Person per;
10
11 public Decorator() {}
12
13 public Decorator (Person per) {
14 this.per = per;
15 }
16 @Override
17 public void show() {
18 per.show();
19 }
20
21 }
code 4:SuperMan.java
1 package com.daike.decorator;
2
3 /**
4 * 具体装饰角色 SuperMan
5 * @author daike
6 *
7 */
8 public class SuperMan extends Decorator{
9
10 public SuperMan () {}
11 public SuperMan (Person per) {
12 super(per);
13 }
14 @Override
15 public void show() {
16 super.show();
17 System.out.println("我还是厉害的超人!");
18 }
19 }
code 5:DecoratorTestDriver.java
1 package com.daike.decorator;
2
3 /**
4 * 测试类
5 * @author diake
6 *
7 */
8 public class DecoratorTestDriver {
9
10 public static void main (String[] args) {
11 Person per = new GenericPerson();
12 Decorator teacher = new Tearcher(per);
13 Decorator superMan = new SuperMan(teacher);
14 //第一次装饰
15 System.out.println("-------------第一次装饰-----------------");
16 teacher.show();
17 //第一次装饰
18 System.out.println("-------------第二次装饰-----------------");
19 superMan.show();
20 }
21 }
运行结果: