【设计模式】装饰器模式 详解

shadowLogo

概述:

装饰器模式 就是使用 被装饰者 的一个实例,在客户端将 这个实例 交给 装饰器 及其 扩展类
动态地新功能 附加到对象上
对象功能扩展 方面,它比 继承 更有 弹性


优缺点:

优点:

使用 装饰器模式,可以提供比继承 更灵活 地扩展对象的功能,
它可以 动态地 添加对象的功能,并且可以 随意地组合 这些功能


缺点:

正因为可以 随意组合,所以就可能出现一些 不合理的逻辑


使用展示:

首先,本人来给出一个需要包装的接口:

原接口:

package edu.youzg.design.pattern.decorator;

public interface Youzg {
    void description();
}

本人再来给出一个 基础描述 的实现类:

基础实现类:

package edu.youzg.design.pattern.decorator;

public class YouzgCharacter implements Youzg {

    @Override
    public void description(){
        System.out.println("Good man!");
    }

}

现在,本人来给出一个 基于该实现类包装器

装饰器 类:

package edu.youzg.design.pattern.decorator;

public class YouzgDecorator implements Youzg{
    private Youzg youzg;

    public YouzgDecorator(Youzg youzg) {
        this.youzg = youzg;
    }

    @Override
    public void description() {
        this.youzg.description();
    }

}

现在,本人来对这个类进行 “声音描述” 和 “外貌描述” 的 包装:

装饰器 扩展类:

package edu.youzg.design.pattern.decorator;

public class YouzgVoice extends YouzgDecorator {

    public YouzgVoice(Youzg youzg) {
        super(youzg);
    }

    @Override
    public void description() {
        super.description();
        System.out.println("磁性迷人的声音");
    }
}
package edu.youzg.design.pattern.decorator;

public class YouzgAppearance extends YouzgDecorator{

    public YouzgAppearance(Youzg youzg) {
        super(youzg);
    }

    @Override
    public void description() {
        super.description();
        System.out.println("风流倜傥");
    }
}

那么,本人现在来给出一个测试类,来测试下经过两轮包装后,对 Youzg的描述:

测试类

package edu.youzg.design.pattern.decorator;

/**
 * @Author: Youzg
 * @CreateTime: 2021-05-10 19:58
 * @Description: 带你深究Java的本质!
 */
public class YouzgTest {

    public static void main(String[] args) {
        Youzg youzg1 = new YouzgCharacter();
        youzg1.description();
        System.out.println("==========");
        Youzg youzg2 = new YouzgVoice(youzg1);
        youzg2.description();
        System.out.println("==========");
        Youzg youzg3 = new YouzgAppearance(youzg2);
        youzg3.description();
    }

}

现在,本人来展示下运行结果
结果


那么,至此,装饰器模式 就讲解完毕了!

posted @ 2021-05-10 20:20  在下右转,有何贵干  阅读(236)  评论(0)    收藏  举报