装饰者模式
什么是装饰者模式
装饰者模式(Decorator Pattern 也称Wrapper Pattern)就是动态的把职责附加到已有对象上去,这种特性,使得装饰者模式提供了比继承更具有弹性的解决方案
装饰者模式类图
1 //抽象类Girl 2 public abstract class Girl { 3 String description="no particular"; 4 5 public String getDescription(){ 6 return description; 7 } 8 }
1 //美国女孩 2 public class AmericanGirl extends Girl{ 3 public AmericanGirl(){ 4 description="+AmericanGirl"; 5 } 6 }
1 //国产妹子 2 public class ChineseGirl extends Girl { 3 public ChineseGirl(){ 4 description="+ChineseGirl"; 5 } 6 }
1 //装饰者 2 public abstract class GirlDecorator extends Girl { 3 public abstract String getDescription(); 4 }
1 //给美国女孩加上金发 2 public class GoldenHair extends GirlDecorator { 3 private Girl girl; 4 5 public GoldenHair(Girl g){ 6 girl=g; 7 } 8 9 @Override 10 public String getDescription() { 11 return girl.getDescription()+"+with golden hair"; 12 } 13 14 }
1 //加上高挑的特性 2 public class Tall extends GirlDecorator { 3 private Girl girl; 4 5 public Tall(Girl g){ 6 girl=g; 7 } 8 9 @Override 10 public String getDescription() { 11 return girl.getDescription()+"+is very tall"; 12 } 13 14 }
1 //检验一下 2 public class Test { 3 public static void main(String[] args) { 4 Girl g1=new AmericanGirl(); 5 System.out.println(g1.getDescription()); 6 7 GoldenHair g2=new GoldenHair(g1); 8 System.out.println(g2.getDescription()); 9 10 Tall g3=new Tall(g2); 11 System.out.println(g3.getDescription()); 12 } 13 14 } 15 /* 16 +AmericanGirl 17 +AmericanGirl+with golden hair 18 +AmericanGirl+with golden hair+is very tall 19 */
装饰者模式和适配器模式的区别
1. 关于新职责:适配器也可以在转换时增加新的职责,但其主要的目的并不在此,而装饰者模式主要目的,就是给被装饰者增加新职责用的
2. 关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统来说是不可见或者说不可用的,而装饰者模式原封不动的用原接口
3. 关于其包裹的对象:适配器是知道被适配者的详细情况的(就是那个类或那个接口),而装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道