美文网首页Java基础
设计模式3.4 装饰器模式

设计模式3.4 装饰器模式

作者: 卢卡斯哔哔哔 | 来源:发表于2018-11-30 12:03 被阅读1次

    点击进入我的博客

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

    3.4.1 装饰器结构

    装饰器模式
    • 抽象构件(Component)角色:给出一个抽象结构,以规范准备接受附加责任的对象。
    • 具体构件(Concrete Component)角色:定义一个要接受附加责任的类
    • 装饰(Decorator)角色:持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
    • 具体装饰(Concrete Decorator)角色:负责给构件对象“贴上”附加的责任。

    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
    • 抽象构件(Component)角色:InputStream
    • 具体构件(Concrete Component)角色:ByteArrayInputStreamPipedInputStreamStringBufferInputStream等原始流处理器。
    • 装饰(Decorator)角色:FilterInputStream
    • 具体装饰(Concrete Decorator)角色:DateInputStreamBufferedInputStreamLineNumberInputStream
    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!");
        }
    }
    

    相关文章

      网友评论

        本文标题:设计模式3.4 装饰器模式

        本文链接:https://www.haomeiwen.com/subject/veaccqtx.html