A Decorator Pattern says that just "attach a flexible additional responsibilities to an object dynamically".java
装饰模式的含义就是:“动态地为对象添加一些附加的责任”。换句话说,Decorator模式使用组合而不是继承来在运行时扩展对象的功能。装饰模式也被称为Wrapper-包装器模式。它是继承的一种替代方案。app
UMLide
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.javaflex
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.javathis
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.javaspa
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.javacode
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 }
运行结果:对象