4.装饰器设计模式
1.概述
- 在不改变原类文件和使用继承情况下,动态的扩展一个类的功能
- 最常见的使用情况:Java IO
- 注意事项:
- 1.装饰对象(外部)和真实对象(内部)有相同的接口
- 2.装饰对象包含一个真实对象的引用
- 3.装饰对象接受客服端发送的请求并把请求转发给真实的对象
2.代码
- 黑心商家需要生产甜味面包和染色的面包
- 1.正常面包的制作过程
-
public interface IBread { void prepair();//准备材料 void kneadFlour();//和面 void bakeBead();//烤面包 void process();//加工面包 }
- 1.1实现
-
public abstract class AbstractBread implements IBread{ private final IBread iBread;//普通面包对象 public AbstractBread(IBread iBread){ this.iBread=iBread; } @Override public void prepair(){ iBread.prepair(); } @Override public void kneadFlour(){ iBread.kneadFlour(); } @Override public void bakeBead(){ iBread.bakeBead(); } @Override public void process(){ prepair(); kneadFlour(); bakeBead(); } }
- 2.甜味面包
-
public class CornBread extends AbstractBread{ public CornBread(IBread iBread) { super(iBread); } @Override//重写和面的函数 public void kneadFlour(){ System.out.println("添加染色剂"); super.kneadFlour(); } }
- 3.染色面包
-
public class CornBread extends AbstractBread{ public CornBread(IBread iBread) { super(iBread); } @Override//重写和面的函数 public void kneadFlour(){ System.out.println("添加染色剂"); super.kneadFlour(); } }
- 4.问题我们现在要生产甜味的染色面包怎么办?
- 4.1 继承AbstractBread,继续重写和面函数
- 4.2 使用装饰器设计模式
-
public class SweetCornBread{ public static void main(String[] args){ IBread nomalBread=new NomalBread(); //普通面包 nomalBread=new CornBread(nomalBread); //第一层包装 nomalBread=new SweetBread(nomalBread);//第二层包装 nomalBread.process(); } }
3.分析
- 1.上述代码中我们进行了两次“包装”得到了甜味的染色面包,这里注意输出的顺序,是先添加甜味素之后再添加染色剂的,说明解包装是从里向外进行的
- 2.包装类和真实类之间一定要有相同的接口