Java设计模式之一:装饰器模式

news2024/9/25 7:37:36

目录

一、什么是装饰器模式

二、装饰器模式如何使用

三、装饰器模式的优势和应用场景


 

一、什么是装饰器模式

装饰器模式是一种结构型设计模式,允许通过动态地将新功能添加到现有对象上,来扩展其行为或修改其外观,同时不改变其原始类的结构

在装饰器模式中,有一个抽象基类(Component)定义了对象的通用接口,具体组件类实现了该接口。装饰器类也实现了相同的接口,并且包含了一个指向抽象组件的引用。装饰器类通过在保持原始类方法不变的情况下,提供了额外的功能。

以下是一个简单的示例来说明装饰器模式

首先,我们定义抽象组件类 Component,它定义了对象的通用接口:

public interface Component {
    void operation();
}

然后,我们创建具体组件类 ConcreteComponent,它实现了 Component 接口:

public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("执行原始操作");
    }
}

接下来,我们创建装饰器类 Decorator,它实现了 Component 接口,并包含一个指向抽象组件的引用:

public abstract class Decorator implements Component {
    protected Component component;

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

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

最后,我们创建具体装饰器类 ConcreteDecoratorA 和 ConcreteDecoratorB,它们继承自 Decorator 类,并在原始操作上添加了额外的功能:

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

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

public 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();
        // 输出:执行原始操作

        Component decoratedComponentA = new ConcreteDecoratorA(component);
        decoratedComponentA.operation();
        // 输出:
        // 执行原始操作
        // 添加额外功能A

        Component decoratedComponentB = new ConcreteDecoratorB(component);
        decoratedComponentB.operation();
        // 输出:
        // 执行原始操作
        // 添加额外功能B

        Component decoratedComponentAB = new ConcreteDecoratorB(new ConcreteDecoratorA(component));
        decoratedComponentAB.operation();
        // 输出:
        // 执行原始操作
        // 添加额外功能A
        // 添加额外功能B
    }
}

在上述示例中,我们首先创建了一个具体组件对象 component,然后通过创建不同的装饰器对象(如 decoratedComponentA 和 decoratedComponentB),在原始操作上添加了额外的功能。装饰器对象可以根据需要嵌套使用,以实现不同层次的功能组合。

装饰器模式通过动态地组合对象来扩展其功能,避免了使用继承导致的类爆炸问题,同时保持了原始类的简洁性和一致性。它提供了一种灵活的方式来修改或增强现有对象的行为,并支持在运行时动态地添加或移除装饰器。

 

二、装饰器模式如何使用

装饰器模式是一种结构型设计模式,用于动态地给一个对象添加额外的功能。它通过将对象包装在一个具有相同接口的装饰器类中,来实现对原始对象的增强而不改变其接口。

以下是一个使用Java实现装饰器模式的简单示例代码:

首先,我们定义一个基础接口 Component,表示被装饰的对象及其接口:

public interface Component {
    void operation();
}

然后,我们实现具体的组件类 ConcreteComponent

public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("Base operation");
    }
}

接下来,我们定义装饰器类 Decorator,它实现了与被装饰对象相同的接口,并持有一个对基础组件的引用:

public abstract class Decorator implements Component {
    protected Component component;

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

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

最后,我们实现具体的装饰器类 ConcreteDecorator,它扩展了装饰器类并添加了额外的功能:

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

    @Override
    public void operation() {
        super.operation();
        additionalOperation();
    }

    private void additionalOperation() {
        System.out.println("Additional operation");
    }
}

现在,我们可以使用这些类来演示装饰器模式的工作方式:

public class Main {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        component.operation();
        // 输出:Base operation

        Component decoratedComponent = new ConcreteDecorator(component);
        decoratedComponent.operation();
        // 输出:
        // Base operation
        // Additional operation
    }
}

在上述示例中,我们首先创建了一个具体组件对象 component,并调用其 operation() 方法。然后,我们创建了一个具体装饰器对象 decoratedComponent,将 component 对象传递给它进行装饰。当我们调用 decoratedComponent 的 operation() 方法时,它会先调用基础组件的 operation() 方法,然后添加额外的功能。

装饰器模式使得我们可以动态地在对象上添加新的行为,而无需改变其接口或修改原始对象。这样既保持了代码的灵活性和可扩展性,又符合开闭原则。装饰器模式在实际开发中经常被用于包装和增强现有的类库或第三方组件。

 

三、装饰器模式的优势和应用场景

装饰器模式是一种结构型设计模式,它允许在不修改现有对象的情况下,动态地将额外的功能添加到对象中。装饰器模式通过包装原始对象来实现这一点,从而对对象进行增强或改变其行为。

装饰器模式的优势包括:

  1. 灵活性:装饰器模式使得我们可以在运行时动态地添加、修改或删除对象的功能,而无需修改原有的代码。这提供了更大的灵活性和扩展性。

  2. 单一职责原则:装饰器模式遵循单一职责原则,每个装饰器类都专注于提供一个特定的功能,从而使得代码更加清晰、可维护和可扩展。

  3. 组合功能:装饰器模式允许将多个装饰器按照需要进行组合,从而实现复杂的功能组合。这样可以灵活地选择要应用的功能,而无需创建大量的类和子类。

一些常见的应用场景包括:

  1. 动态功能增加:当需要在运行时动态地为对象添加新功能时,装饰器模式非常有用。例如,可以使用装饰器模式来动态地给文本编辑器添加拼写检查、格式化、自动保存等功能。

  2. 动态功能组合:当需要以不同的方式组合对象的功能时,装饰器模式可以提供灵活的解决方案。例如,可以使用装饰器模式来动态地组合菜单项的功能,以满足不同用户的需求。

  3. 对象透明包装:当需要对对象进行透明的包装,以提供额外的功能或修改其行为时,可以使用装饰器模式。例如,在Web开发中,可以使用装饰器模式来对请求或响应对象进行包装,以添加安全验证、日志记录等功能。

总的来说,装饰器模式在需要动态地增强对象功能、实现功能组合和保持代码灵活性的情况下非常有用。它允许我们通过包装原始对象来轻松地添加新的功能,同时保持对象的接口不变,遵循设计原则,并提高代码的可维护性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模型轻量化神器:3D格式转化工具HOOPS Exchange可将文件压缩小100倍!

​领先的CAD导入和导出库 使用用于CAD数据转换的HOOPS Exchange SDK将30多种CAD文件格式导入到您的应用程序中,具有对2D和3D CAD文件格式(包括 CATIA、SOLIDWORKS、Inventor™、Revit™、Creo、 NX™、Solid Edge 等,全部通过单个API实现。 …

TikTok品牌出海:打造独特内容,提升品牌影响力

随着社交媒体的迅猛发展,TikTok作为全球最热门的短视频平台之一,为品牌出海提供了独特的机遇。然而,要在TikTok上成功推广品牌,关键在于创造出引人注目、有吸引力的内容。本文Nox聚星将和大家探讨在TikTok上,什么样的内…

HTML写一个16:9自适应的页面

效果图&#xff1a; 页面可以按照窗口大小自适应变化&#xff0c;并且可以保持16:9 <!DOCTYPE html> <html><head><style>body {margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;}#box {width: calc(…

APP外包开发的用户行为分析工具

APP开发完成上线后&#xff0c;运营人员希望得到用户在使用APP过程中的行为数据&#xff0c;比如更喜欢哪个功能、停留时长、使用路径等指标数据&#xff0c;这对于产品的下一步改进非常重要。运营和产品人员有了这些数据才能更好的设计新功能。今天和大家分享这方面的工具&…

【动手学习深度学习--逐行代码解析合集】05softmax回归简洁实现

【动手学习深度学习】逐行代码解析合集 05softmax回归简洁实现 视频链接&#xff1a;动手学习深度学习–softmax回归简洁实现 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 代码 net.apply()若不懂可参考: https://blog.csdn.…

第八章CAS策略

文章目录 JDK提供的原子类没有CAS之前引入CAS之后 CAS是什么CAS原理代码演示如何保证的原子性硬件级别保证 源码分析CAS底层原理&#xff1f;如果知道&#xff0c;谈谈你对UnSafe的理解例子atomicInteger.getAndIncrement()为什么安全 自定义原子引用CAS与自旋锁实现自旋锁 CAS…

SD卡可以数据恢复吗 SD卡数据恢复软件

随着数码设备的普及和存储容量的不断增加&#xff0c;SD卡已经成为我们常用的存储介质之一。在使用过程中&#xff0c;不可避免地会遇到SD卡数据丢失的情况&#xff0c;可能是因为误操作、格式化、病毒感染或物理损坏等。幸运的是&#xff0c;现在有许多专业的SD卡数据恢复软件…

Guava RateLimiter:原理、源码和思想

Guava RateLimiter&#xff1a;原理、源码和思想 三种限流算法计数器法漏桶算法令牌桶算法 RateLimiterRateLimiter的使用RateLimiter原理RateLimiter获取令牌获取令牌的基本流程获取令牌的详细源码解读 RateLimiter的两种限流器试验&#xff1a;感受两种限流器的区别SmoothBur…

Mysql 事务优化

事务的ACID特性: 原子性(Atomicity):当前事务的操作要么同时成功&#xff0c;要么同时失败。原子性由undo log日志来保证 一致性(Consistency):使用事务的最终目的&#xff0c;由业务代码正确逻辑保证 隔离性(lsolation):在事务并发执行时&#xff0c;他们内部的操作不能互相…

Ai 制作简单的iconfont字体图标

打开网址https://www.iconfont.cn/icons/upload?spma313x.7781069.1998910419.d059fa781 下载矢量图标设计模板,如图 打开下载的图标制作模版.ai文件 点击椭圆工具画一个大小为900*900的圆 点击文字工具&#xff0c;输入文字内容并调整为合适的大小&#xff0c;例610px …

欧科云链OKLink:2023年6月安全事件盘点

一、基本信息 2023年6月REKT和RugPull事件约造成约1000万美元损失&#xff0c;相比上月有显著下降&#xff0c;但安全事件发生数量依旧不减。其中被废弃的Atlantis Loans遭受治理攻击&#xff0c;造成的损失超250万美元&#xff0c;对该协议有过授权的用户需及时撤销授权。另外…

GRU、LSTM、注意力机制(第八次组会)

GRU、LSTM、注意力机制(第八次组会) 一、 GRU二、 LSTM三、 深度RNN、双向RNN四、 注意力机制一、 GRU 二、 LSTM 三、 深度RNN、双向RNN

机器学习实验-决策树、朴素贝叶斯、KNN模型的应用

实验 决策树-西瓜数据集基于基尼系数剪枝人体运动状态预测数据集西瓜数据集人体特征数据集 机器学习 数据集有两个&#xff0c;一个是西瓜数据集&#xff0c;另一个是人体特征数据集 决策树-西瓜数据集 基于信息熵准则进行划分选择的决策树算法的实现过程(不使用现有的机器学习…

有必要使用性能测试工具吗?

有必要使用性能测试工具吗&#xff1f;性能测试工具是一种帮助开发人员和测试人员评估应用程序、网站或系统性能的软件。这些工具主要用于测量响应时间、吞吐量、并发用户数、资源利用率等指标&#xff0c;以及发现系统瓶颈和瓶颈原因&#xff0c;那其作用意义有哪些&#xff1…

Flutter Linux desktop桌面版Build App流程

Flutter Linux desktop桌面版Build App流程 Flutter 是 Google推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App&#xff0c;一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口&#xff0c;开发者…

maven-mvnd 的使用

maven-mvnd是Apache Maven团队借鉴了Gradle和Takari的优点&#xff0c;衍生出来的更快的构建工具&#xff0c;是maven的强化版。 github地址&#xff1a;https://github.com/apache/maven-mvnd maven-mvnd 特性&#xff1a; 嵌入 Maven (所以不需要单独安装 Maven)&#xff…

【kubernetes系列】kubernetes之initcontainer初始化容器

概述 Init Container就是用来做初始化工作的容器&#xff0c;可以是一个或者多个&#xff0c;如果有多个的话&#xff0c;这些容器会按定义的顺序依次执行&#xff0c;只有所有的Init Container执行完后&#xff0c;主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据…

日本PSE认证341种B类产品为非特定电器和材料类清单

以上清单为官方网站直译&#xff0c;可能存在差异&#xff0c;具体以官方为准。

为什么普通人升级电脑的意愿消逝了

简洁版答案&#xff1a;需求消逝了。 市场调研机构Canalys数据显示&#xff0c;今年一季度&#xff0c;中国市场整体PC出货量同比下降24%至890万台&#xff0c;已是连续第五个季度下跌。今年截至618结束&#xff0c;都没有一家主要的PC厂商愿意发战报。PC市场怎样走出寒冬&…

微服务系列文章之 seata 事务模式

XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xff0c;Distributed Transaction Processing&#xff09;标准。 XA 规范 描述了全局的TM与局部的RM之间的接口&#xff0c;几乎所有主流的数据库都对 XA 规范 提供了支持。 两阶段提交 XA是规范&…