装饰模式

什么是装饰模式?

装饰器模式,也成为包装模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下:


1321.png

Component为统一接口,也是装饰类和被装饰类的基本类型。

ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。

Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。

ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。

装饰模式案例

//房屋基础接口
public interface House {
     void run();
}
//房屋装饰类
public class HouseDecorate implements House {
   private House house;
   public HouseDecorate(House house){
      this.house=house;
   }
    @Override
    public void run() {
        house.run();
    }

}
public class HouseDecorateImpl extends HouseDecorate {

    public HouseDecorateImpl(House house) {
        super(house);

    }
@Override
    public void run() {
        super.run();
        System.out.println("贴上墙纸..");
    }

}
//客户端调用
public class ClientTest {

    public static void main(String[] args) {
        HouseImpl houseImpl = new HouseImpl();
        houseImpl.run();
        System.out.println("###新增贴上墙纸..###");
        HouseDecorate houseDecorate = new HouseDecorateImpl(houseImpl);
        houseDecorate.run();
    }

}

装饰与代理区别

装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

装饰模式应用场景

  • 在IO中,具体构件角色是节点流,装饰角色是过滤流。
  • FilterInputStream和FilterOutputStream是装饰角色,而其他派生自它们的类则是具体装饰角色。
  • DataoutputStream out=new DataoutputStream(new FileoutputStream());
    这就是 装饰者模式,DataoutputStream是装饰者子类,FileoutputStream是实现接口的子类。
  • 这里不会调用到装饰者类--FilteroutputStream,只是作为继承的另一种方案,对客户端来说是透明的,是为了功能的扩张.
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【学习难度:★★★☆☆,使用频率:★★★☆☆】直接出处:装饰模式梳理和学习:https://github.com/...
    BruceOuyang阅读 742评论 2 2
  • 1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况。有三个继承...
    今晚打肉山阅读 309评论 0 0
  • 罪恶的成绩单 考试成绩单以及成绩排名,大家都懂得,以前上学的时候,这玩意往家里寄是真的要命。成绩单还需要家长签字,...
    stayiwithime阅读 169评论 0 0
  • 装饰模式(结构型) 一、概述 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,...
    哈哈大圣阅读 323评论 0 0
  • 1.装饰模式简介 装饰模式介绍 装饰模式是结构型设计模式之一,不必改变类文件和使用继承的情况下,动态地扩展一个对象...
    刘望舒阅读 682评论 2 8