Java设计模式之结构型模式 | 装饰器模式

77 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情

觉得对你有益的小伙伴记得点个赞+关注

后续完整内容持续更新中

希望一起交流的欢迎发邮件至javalyhn@163.com

1. 装饰器模式定义

装饰器是增强一个类

创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

2. 装饰器模式角色说明

  • 抽象构件(Component)角色:
    • 定义一个抽象接口以规范准备接收附加责任的对象。
  • 具体构件(ConcreteComponent)角色:
    • 实现抽象构件,通过装饰角色为其添加一些职责。
  • 抽象装饰(Decorator)角色:
    • 继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  • 具体装饰(ConcreteDecorator)角色:
    • 实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

3. 装饰器模式使用场景

  1. 需要扩展一个类的功能,或给一个类增加附加功能。
  2. 需要动态的给一个雷甜家功能,这些功能可以再动态的撤销。
  3. 需要为一批的兄弟类进行改装或加装功能。

4. 装饰器模式的实现

我们给定以下某音实现美颜场景。

image.png

ManTikTok

/**
 * 抽象构建
 */
public  interface ManTikTok {
   void tiktok();
}

ZhangTikTok

public class ZhangTikTok implements ManTikTok{
    @Override
    public void tiktok() {
        System.out.println("张三,tiktok.... ");
    }
}

LeiTikTok

public class LeiTikTok implements ManTikTok{
    @Override
    public void tiktok() {
        System.out.println("雷,tiktok.... ");
    }
}

TiktokDecorator

/**
 * 抽象装饰器
 * 某音直播装饰器
 */
public interface TiktokDecorator extends ManTikTok{

    void enable();
}

MeiYanDecorator

/**
 * 美颜装饰器
 *      装饰谁?
 *
 *  装饰器只关系增强这个类的方法。
 */
public class MeiYanDecorator implements TiktokDecorator{

//    private Framework framework;  适配器

    private ManTikTok manTikTok;
    public MeiYanDecorator(ManTikTok manTikTok){
        this.manTikTok = manTikTok;
    }

    @Override
    public void tiktok() {
        //开启美颜
        enable();
        //
//        framework.enableMeiYan();

        //我开始直播
        manTikTok.tiktok();
    }


    /**
     * 定义的增强功能
     */
    @Override
    public void enable() {
        System.out.println("看这个美女.....");
        System.out.println("花花花花花花花花花花花");
    }
}

MainTest

/**
 * 核心:想要不改变原来接口方法的情况下扩展新功能,或者增强方法.....
 */
public class MainTest {

    public static void main(String[] args) {
        //被装饰对象
        ManTikTok manTikTok = new LeiTikTok();
//        manTikTok.tiktok();

        /**
         *  LiMingTiktokProxy proxy = new LiMingTiktokProxy(new LeiTikTok());
         *         proxy.tiktok();
         */

        MeiYanDecorator decorator = new MeiYanDecorator(manTikTok);
        decorator.tiktok();
    }
}

image.png

5. 装饰器模式优缺点

5.1 优点

  1. 装饰类和被装饰类可以独立发展,而不会相互耦合。
  2. 装饰器模式是继承关系的一种替代方案。
  3. 装饰器模式可以动态的拓展一个实现类的功能

5.2 缺点

多层的装饰是比较复杂的,就像剥洋葱一样,你剥到了最后才发现是最里层的装饰出现了问题,想想一下有多少的工作量吧,因此尽量减少装饰类的数量,以便降低系统的并发度。