装饰者模式,避免排列组合产生过多的子类,动态生成所需功能。
举例,你需要一杯黄豆豆浆,但分很多种类,你要加糖的,加红枣的,加花生的... 这就罢了,我要加糖的加红枣的 或者 加糖的加花生的 或者 三者都加的,如果设计所有子类会产生很多,所以就有了装饰者模式。
新建一个接口Soy,并定义抽象方法soyKind:
1 public interface Soy 2 { 3 public String soyKind(); 4 }
新疆一个类 SoyImpl,实现Soy接口,必须实现soyKind()方法。这个是被装饰者,以这个为基础。
1 public class SoyImpl implements Soy 2 { 3 @Override 4 public String soyKind() 5 { 6 // TODO Auto-generated method stub 7 System.out.println("基本豆浆种类,比如说以黄豆为基本原料的"); 8 return "黄豆豆浆"; 9 } 10 }
新建一个类Date,Date(枣),加枣的黄豆豆浆。
1 //加红枣的豆浆 red dates红枣的意思 2 public class Date implements Soy 3 { 4 private Soy soy; 5 6 public Date(Soy soy) 7 { 8 this.soy = soy; 9 } 10 11 @Override 12 public String soyKind() 13 { 14 // TODO Auto-generated method stub 15 return soy.soyKind() + "带红枣"; 16 } 17 }
新建一个类Sugar,加糖的黄豆豆浆。
1 //加糖的豆浆 2 public class Sugar implements Soy 3 { 4 private Soy soy; 5 6 public Sugar(Soy soy) 7 { 8 this.soy = soy; 9 } 10 11 @Override 12 public String soyKind() 13 { 14 // TODO Auto-generated method stub 15 return soy.soyKind() + "带糖"; 16 } 17 }
新建测试类
1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 Soy soy=new SoyImpl(); 6 Soy soy2=new Sugar(soy); 7 Soy soy3=new Date(soy2); 8 System.out.println(soy3.soyKind()); 9 } 10 }