设计模式【结构型】-- 装饰者模式

这篇具有很好参考价值的文章主要介绍了设计模式【结构型】-- 装饰者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

装饰模式(Decorator Pattern)

定义

装饰者模式是一种结构型设计模式,它允许你动态地将新功能添加到对象中,通过将对象放入包含这些功能的特殊包装器对象中。这样一来,你可以在运行时通过组合不同的对象来扩展功能,而不是通过继承修改代码。

大白话装饰模式,是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)

装饰(Decorator)模式中的角色:

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

案例

以下是装饰者模式在Java中的示例代码:

// 定义一个组件接口
interface Component {
    void operation();
}

// 具体组件实现类
class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("执行具体操作");
    }
}

// 装饰者抽象类
abstract class Decorator implements Component {
    protected Component component;

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

    @Override
    public void operation() {
        component.operation();
    }
}

// 具体装饰者类A
class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        System.out.println("添加额外功能A");
    }
}

// 具体装饰者类B
class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        System.out.println("添加额外功能B");
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        component.operation();

        System.out.println("-------------------");

        Component decoratedComponent = new ConcreteDecoratorA(new ConcreteDecoratorB(new ConcreteComponent()));
        decoratedComponent.operation();
    }
}

设计模式【结构型】-- 装饰者模式,设计模式,java,开发语言

案例分析说明

在上述代码中,Component 是组件接口,定义了一个 operation 方法。ConcreteComponent 是具体组件实现类,实现了 Component 接口并实现了具体操作。

Decorator 是装饰者抽象类,实现了 Component 接口,并维护一个 Component 对象作为成员变量。Decorator 类的 operation 方法会在调用其包含的组件的 operation 方法之前或之后添加额外的功能。

ConcreteDecoratorAConcreteDecoratorB 是具体装饰者类,分别继承自 Decorator 类。它们在调用父类的 operation 方法后,添加了不同的额外功能。

Main 类的示例中,我们首先创建了一个 ConcreteComponent 对象,并调用其 operation 方法。然后,我们使用装饰者模式创建了一个具有多层装饰的对象,并调用其 operation 方法。可以看到,每个装饰者在执行完自身的操作后,会继续调用下一个装饰者或具体组件的操作。

优点:

现在,让我们来比较装饰者模式和继承的优缺点及适用场景:

  1. 装饰者模式可以动态地添加或删除对象的功能,而无需修改现有代码,更具灵活性。
  2. 装饰者模式遵循开闭原则,即对扩展开放、对修改关闭。你可以通过增加新的装饰者类来扩展功能,而不是修改已有类的代码。
  3. 装饰者模式避免了使用大量的继承来扩展功能,减少了类的个数,提高了代码的可读性和维护性。

缺点:

  1. 使用装饰者模式会增加许多小对象,如果过度使用,可能会导致系统复杂性增加。
  2. 装饰者模式在设计时需要注意顺序,因为装饰者是通过嵌套组合的方式实现的。如果顺序不正确,可能会影响到最终的结果。

适用场景:

  1. 当你需要在不修改现有对象的情况下,动态地为对象添加额外功能时,可以使用装饰者模式。
  2. 当你有多个相互独立的扩展方案,且可能需要组合使用时,装饰者模式比继承更灵活。
  3. 当你希望根据需要透明地、逐级地给对象添加功能时,装饰者模式非常适用。

总结

总结起来,装饰者模式通过组合而不是继承来实现功能的扩展,使得代码更加灵活、可扩展,并符合开闭原则。它适用于需要动态地为对象添加功能、避免使用过多继承、以及逐级透明地给对象添加功能的情况。文章来源地址https://www.toymoban.com/news/detail-561834.html

到了这里,关于设计模式【结构型】-- 装饰者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++设计模式之装饰模式:结构型】分析及示例

    装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地给一个对象添加额外的行为。 描述 装饰模式通过创建一个包装器(Wrapper)来包裹原始对象,并在原始对象的行为前后添加额外的功能。通过这种方式,可以实现在不改变原始对象结构的情况下,动态

    2024年02月07日
    浏览(28)
  • 《golang设计模式》第二部分·结构型模式-04-装饰器模式(Decorator)

    装饰器(Decorator)通过包装(不是继承)的方式向目标对象中动态地添加或删除功能。 Component(抽象组件):定义了原始对象的接口,装饰器也会实现这个接口。 Concrete Component(具体组件):原始对象,以后装饰器会装饰它。 Decorator(抽象装饰器):关联/聚合了抽象组件,

    2024年02月09日
    浏览(35)
  • 设计模式-04.01-结构型-代理&桥接&装饰器&适配器

    创建型模式比较好理解,后面的结构型和行为型设计模式不是那么好理解。如果遇到不好理解的设计模式,我一般会在开头举比较简单的Demo案例来帮助理解。 前面几节,我们讲了设计模式中的创建型模式。创建型模式主要解决对象的创建问题,封装复杂的创建过程,解耦对

    2024年02月09日
    浏览(48)
  • 【Java 设计模式】结构型之桥接模式

    桥接模式(Bridge Pattern)是一种结构型设计模式, 它将抽象部分与实现部分分离,使它们可以独立变化,从而降低它们之间的耦合 。桥接模式通过将抽象部分和实现部分分离,使得它们可以独立地变化,同时在它们之间建立一个桥梁。在本文中,我们将介绍 Java 中桥接模式的

    2024年01月19日
    浏览(38)
  • 【Java 设计模式】结构型之外观模式

    外观模式(Facade Pattern)是一种结构型设计模式, 它为复杂系统提供了一个简化的接口,隐藏了系统的复杂性,使得客户端更容易使用系统 。外观模式通过创建一个包装类(外观类),将系统的复杂性封装起来,对客户端提供一个简单的接口。在本文中,我们将深入研究Ja

    2024年01月21日
    浏览(36)
  • 【Java 设计模式】结构型之代理模式

    代理模式(Proxy Pattern)是一种结构型设计模式, 它允许通过一个代理对象控制对其他对象的访问 。代理模式在访问对象时引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的操作。在本文中,我们将深入研究Java中代理模式的定义、结构、使用场景以及如何在

    2024年01月21日
    浏览(37)
  • Java学习——设计模式——结构型模式2

    结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来实现更灵活的功能。 包括: 1、适配器 2、桥接 3、组合 4、装

    2024年02月03日
    浏览(37)
  • 【十】设计模式~~~结构型模式~~~享元模式(Java)

    【学习难度:★★★★☆,使用频率:★☆☆☆☆】         面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。 享元模式正是为解决这一类问题

    2024年02月08日
    浏览(42)
  • Java设计模式-结构型-适配器模式

    ​ 与电源适配器相似,在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用

    2024年02月20日
    浏览(42)
  • Java23种设计模式-结构型模式之组合模式

    组合模式 (Composite Pattern):将 对象组合成树状结构 以表示“ 部分-整体 ”层次结构,同时保持对单个对象和组合对象的一致性操作,主要目的是简化客户端代码,因为它可以统一处理单个对象和组合对象。 通常包含以下几个角色: 角色1. 抽象组件 (Component):声明了 组

    2024年04月26日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包