Java基础

设计模式3.4 装饰器模式

2018-11-30  本文已影响1人  卢卡斯哔哔哔

点击进入我的博客

装饰器模式(Decorator)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

3.4.1 装饰器结构

装饰器模式

3.4.2 装饰器细节

使用场景
  1. 需要扩展一个类的功能
  2. 需要动态地给一个对象增加功能,这些功能可以再动态的插销
  3. 需要增加由一些基本功能的排列组合而产生非常大量的功能
优点
  1. 更加灵活:装饰模式和继承关系的目的都是要扩展对象的功能,但是装饰模式比继承更加灵活
  2. 多样性:通过使用不同具体装饰类及其排列组合,可以创造出不同的行为
  3. 动态扩展:装饰器可以动态扩展构件类
缺点
  1. 会产生比继承关系更多的对象
  2. 比继承更加容易出错
注意点
  1. 装饰类的接口必须与被装饰类的接口相容。
  2. 尽量保持抽象构件(Component)简单。
  3. 可以没有抽象的(Component),此时装饰器(Decorator)一般是具体构件(Concrete Component)的一个子类。
  4. 装饰(Decorator)和具体装饰(Concrete Decorator)可以合并。
InputStream及其子类
InputStream
OutputStream及其子类

也用到类装饰器模式

3.4.3 例子

// Component:一个艺人
interface Artist {
    void show();
}

// Concrete Component:一个歌手
class Singer implements Artist {
    @Override
    public void show() {
        System.out.println("Let It Go");
    }
}

// 装饰后的歌手:不仅会唱歌,还会讲笑话和跳舞
class SuperSinger implements Artist {
    private Artist role;
    
    public SuperSinger(Artist role) {
        this.role = role;
    }
    @Override
    public void show() {
        System.out.println("Tell Jokes!");
        role.show();
        System.out.println("Dance!");
    }
}
上一篇 下一篇

猜你喜欢

热点阅读