• 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.包装类和真实类之间一定要有相同的接口
  • 相关阅读:
    STL源码剖析:迭代器
    STL源码剖析:配置器
    [bzoj3940][Usaco2015 Feb]Censoring
    [bzoj2212][Poi2011]Tree Rotations
    [bzoj2733]永无乡&&[bzoj3545]Peaks
    挂个AC自动机
    [bzoj4237]稻草人
    莫比乌斯反演定理证明
    斜率优化dp学习
    备忘
  • 原文地址:https://www.cnblogs.com/yangyunnb/p/6438256.html
Copyright © 2020-2023  润新知