装饰者模式,最简单的代码

装饰者模式,避免排列组合产生过多的子类,动态生成所需功能。

举例,你需要一杯黄豆豆浆,但分很多种类,你要加糖的,加红枣的,加花生的... 这就罢了,我要加糖的加红枣的 或者 加糖的加花生的 或者 三者都加的,如果设计所有子类会产生很多,所以就有了装饰者模式。

新建一个接口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 }
原文地址:https://www.cnblogs.com/houzhg/p/3508832.html