4.装饰器设计模式

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.包装类和真实类之间一定要有相同的接口

 

posted @ 2017-02-24 13:47  疯狂的肉包  阅读(210)  评论(0编辑  收藏  举报