23种设计模式之装饰器模式(Decorator Pattern)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的装饰器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始
在这里插入图片描述

装饰器模式概念

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许我们在不修改已有代码的情况下,通过动态地将责任附加到对象上,来扩展其功能

在装饰器模式中,有一个抽象的组件类,定义了被装饰对象和装饰者共同实现的接口。然后,有若干个具体的装饰者类,它们都实现了该接口,并同时持有一个指向抽象组件类的引用。装饰者类负责给被装饰对象添加新的行为或职责,但不改变它原有的结构和功能。

通过将多个具体的装饰者类链式组合,我们可以将多个行为一一地“包装”到被装饰对象上,从而形成一个完整的处理流程。最终的处理过程由 “客户端” 触发,被装饰对象会先经过第一个装饰者进行处理,再经过下一个装饰者,直到最后完成所有的处理。这就像是套娃一样,可以灵活地对对象进行组合,增强其功能。

装饰器模式优缺点

装饰器模式的主要优点有:

  1. 装饰器模式可以在不改变现有代码的情况下,动态地扩展一个对象的功能。
  2. 可以使用多个装饰器来组合成一个对象,可以灵活地增强对象的功能。
  3. 装饰器模式遵循开闭原则,可以通过新增装饰器来扩展功能,而无需修改已有代码。

装饰器模式的缺点也存在:

  1. 过度的使用装饰器模式会导致程序中出现大量的小类,可能会使程序结构变得复杂。
  2. 如果过度地使用继承来实现装饰器模式,可能会导致设计失去灵活性和可复用性。

装饰器模式适用情况

  • 当需要透明且动态地向对象添加职责时,可以使用装饰器模式。
  • 当不能使用继承对系统进行扩展时,可以使用装饰器模式。
  • 当需要在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责时,可以使用装饰器模式。

装饰器模式代码案例

以下是一个简单的 Java 代码示例,演示如何使用装饰器模式为一个文本编辑器添加加粗、倾斜和下划线等功能。

首先,我们定义基础接口 Component,表示文本编辑器中的某个组件。我们定义了三种不同的组件:Label, TextField 和 Button。

public interface Component {
    public void draw();
}

public class Label implements Component {
    public void draw() {
        System.out.println("Drawing Label...");
    }
}

public class TextField implements Component {
    public void draw() {
        System.out.println("Drawing TextField...");
    }
}

public class Button implements Component {
    public void draw() {
        System.out.println("Drawing Button...");
    }
}

然后,我们定义一个装饰器类 Decorator,作为所有具体装饰器的基类,实现了 Component 接口,并拥有一个指向 Component 的引用。同时,定义了方法 addDecorator,用于增加新的装饰器。

public abstract class Decorator implements Component {
    private Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    public void addDecorator(Decorator decorator) {
        if(component.getClass().equals(getClass())) {
            ((Decorator)component).addDecorator(decorator);
        } else {
            component = decorator;
        }
    }

    public void draw() {
        component.draw();
    }
}

最后,我们实现具体的装饰器,比如 BoldDecorator,用于给文本添加加粗效果,ItalicDecorator,用于给文本添加倾斜效果,UnderlineDecorator,用于给文本添加下划线效果。这些装饰器都继承了 Decorator 并实现了 draw 方法。

public class BoldDecorator extends Decorator {
    public BoldDecorator(Component component) {
        super(component);
    }

    public void draw() {
        System.out.println("Drawing Bold Text...");
        super.draw();
    }
}

public class ItalicDecorator extends Decorator {
    public ItalicDecorator(Component component) {
        super(component);
    }

    public void draw() {
        System.out.println("Drawing Italic Text...");
        super.draw();
    }
}

public class UnderlineDecorator extends Decorator {
    public UnderlineDecorator(Component component) {
        super(component);
    }

    public void draw() {
        System.out.println("Drawing Underline Text...");
        super.draw();
    }
}

最后,我们可以创建一个 Label 组件,并为其动态添加不同的装饰器来实现功能拓展:

Component label = new Label();

// 添加加粗、倾斜和下划线装饰器
label.addDecorator(new BoldDecorator(label));
label.addDecorator(new ItalicDecorator(label));
label.addDecorator(new UnderlineDecorator(label));

label.draw();

通过运行以上代码,输出结果如下:

Drawing Underline Text…
Drawing Italic Text…
Drawing Bold Text…
Drawing Label…

以上就是一个简单的 Java 装饰器模式的示例,我们可以看到,在不改变被装饰对象的前提下,我们成功地实现了文本加粗、倾斜和下划线的功能拓展。通过组合多个装饰器,也可以实现更复杂的对象行为。

装饰器模式小结

装饰器模式是一种非常灵活、可扩展、动态地添加职责的设计模式,被广泛应用于 Java IO、Swing 等领域。

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小威要向诸佬学习呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值