装饰者模式(Decorator Pattern,有的也用 Wrapper Pattern)就是动态地把职责附加到已有对象上去,实现功能扩展。这种特性,使得
装饰者模式提供了比继承更具有弹性的解决方案。
实例场景 : 给中国美国(或者其它国家)的女孩加上外表的属性(如长发,身高等),
UML图:
步骤:
1 创建一个女孩girl
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 22:57 4 * @Version 1.0 5 * 抽象Girl 6 */ 7 public abstract class Girl { 8 String description = "no particular"; 9 10 public String getDescription() { 11 return description; 12 } 13 }
2 创建一个具有特性的女孩(这里以美国女孩为例),继承顶级类girl
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 23:00 4 * @Version 1.0 5 * 美国女孩 6 */ 7 public class AmericanGirl extends Girl { 8 public AmericanGirl() { 9 description = "+AmericanGirl"; 10 } 11 }
3 创建一个装饰者的抽象类,根据UML图可知,继承girl类
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 23:03 4 * @Version 1.0 5 * 装饰者 6 */ 7 public abstract class GirlDecorator extends Girl { 8 public abstract String getDescription(); 9 }
4根据自己的需求进行装饰(这里仅仅以金发,身高为例)
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 23:05 4 * @Version 1.0 5 * 装饰头发 6 */ 7 public class GoldHandler extends GirlDecorator { 8 private Girl girl; 9 10 public GoldHandler(Girl g) { 11 girl = g; 12 } 13 14 @Override 15 public String getDescription() { 16 return girl.getDescription() + " with golden hair"; 17 } 18 }
1 public class Tall extends GirlDecorator { 2 private Girl girl; 3 4 public Tall(Girl g) { 5 girl = g; 6 } 7 8 @Override 9 public String getDescription() { 10 return girl.getDescription()+" is very tall"; 11 } 12 }
5创建一个测试类,给美国女孩加上装饰
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 23:09 4 * @Version 1.0 5 */ 6 public class DecorateTest { 7 public static void main(String[] args) { 8 AmericanGirl g = new AmericanGirl(); 9 System.out.println(g.getDescription()); 10 GoldHandler g2 = new GoldHandler(g); 11 System.out.println(g2.getDescription()); 12 Tall g3 = new Tall(g2); 13 System.out.println(g3.getDescription()); 14 } 15 } 16 17 Result: 18 AmericanGirl 19 AmericanGirl with golden hair 20 AmericanGirl with golden hair is very tall
总结 :
当你需要动态的给一个对象添加功能,实现功能扩展的时候,就可以使用装饰者模式
常见的应用场景 :
在JavaIO类中,BufferedReader装饰了InputStreamReader
BufferReader input = new BufferReader(new InputStreamReader(System.in))
说明 :以上的实例来自实验楼学习网站.