12、【装饰器模式】动态地为对象添加新功能

这篇具有很好参考价值的文章主要介绍了12、【装饰器模式】动态地为对象添加新功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

你好,我是程序员雪球。

今天我们来聊聊 23 种设计模式中,一种常见的结构型模式,装饰器模式。聊聊它的设计思想、实现原理,应用场景,以及如何使用。

 12、【装饰器模式】动态地为对象添加新功能,业务逻辑,设计模式

 

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变原始类的基础上,动态地为对象添加新的功能或行为。它通过创建一个包装类来包装原始类的实例,并在包装类中提供新的功能。这种模式的核心思想是“组合优于继承”,因为它允许在运行时动态地选择和组合不同的功能。

 

一、设计思想

装饰器模式的设计思想是将功能的添加与类的继承解耦。在传统的面向对象编程中,如果需要为一个类添加新的功能,通常会使用继承来扩展类的功能。然而,继承存在一些问题,例如代码冗余、类的层次结构复杂、灵活性较差等。装饰器模式通过创建一个包装类来包装原始类的实例,并在包装类中提供新的功能,从而避免了这些问题。

 

二、实现原理:

装饰器模式的实现原理是通过创建一个抽象装饰器类和具体装饰器类来实现的。抽象装饰器类定义了一个抽象方法,该方法接受一个原始类的实例作为参数,并返回一个包装类的实例。具体装饰器类实现了抽象装饰器类的抽象方法,并在包装类中提供了新的功能。

 

三、应用场景

装饰器模式适用于需要在不改变原始类的基础上,动态地为对象添加新的功能或行为的场景。例如:

 

1. 扩展性:如果你的系统需要不断地添加新的功能,而这些功能可能会影响到现有类的结构,那么使用装饰器模式可以避免修改现有类的代码,从而提高系统的扩展性。

2. 灵活性:如果你的系统需要根据不同的需求来动态地组合不同的功能,那么使用装饰器模式可以提供更大的灵活性。

3. 重用性:如果你的系统中有一些通用的功能,例如日志记录、性能监控等,那么使用装饰器模式可以将这些功能封装成装饰器类,从而提高代码的重用性。

4. 可维护性:如果你的系统中有一些复杂的功能,例如权限验证、数据加密等,那么使用装饰器模式可以将这些功能封装成装饰器类,从而提高系统的可维护性。

 

四、示例代码

 

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

 

java 复制

public class DecoratorPatternExample {

    public static void main(String[] args) {

        // 创建原始对象

        Component component = new Component();

        // 创建装饰对象

        ComponentDecorator decorator1 = new ComponentDecorator1(component);

        ComponentDecorator decorator2 = new ComponentDecorator2(decorator1);

        // 调用方法

        decorator2.operation();

    }

}

 

// 原始类

abstract class Component {

    public abstract void operation();

}

 

// 具体原始类

class ComponentImpl extends Component {

    @Override

    public void operation() {

        System.out.println("Component operation()");

    }

}

 

// 抽象装饰器类

abstract class ComponentDecorator extends Component {

    protected Component component;

 

    public ComponentDecorator(Component component) {

        this.component = component;

    }

 

    @Override

    public void operation() {

        component.operation();

    }

}

 

// 具体装饰器类 1

class ComponentDecorator1 extends ComponentDecorator {

    public ComponentDecorator1(Component component) {

        super(component);

    }

 

    @Override

    public void operation() {

        super.operation();

        // 添加新的功能

        System.out.println("ComponentDecorator1 operation()");

    }

}

 

// 具体装饰器类 2

class ComponentDecorator2 extends ComponentDecorator {

    public ComponentDecorator2(Component component) {

        super(component);

    }

 

    @Override

    public void operation() {

        super.operation();

        // 添加新的功能

        System.out.println("ComponentDecorator2 operation()");

    }

}

 

 

在上述示例中,我们创建了一个原始类 Component 和两个具体的原始类 ComponentImpl ,以及一个抽象装饰器类 ComponentDecorator 和两个具体的装饰器类 ComponentDecorator1 和 ComponentDecorator2 。在 ComponentDecorator 类中,我们定义了一个 component 属性来保存原始类的实例,并在 operation 方法中调用原始类的 operation 方法。在具体的装饰器类中,我们可以在 operation 方法中添加新的功能,并在调用原始类的 operation 方法之前或之后执行。

 

在 main 方法中,我们创建了一个原始对象 component 和两个装饰对象 decorator1 和 decorator2 。我们将原始对象作为参数传递给装饰对象的构造函数,从而创建了一个装饰对象的链。最后,我们调用装饰对象的 operation 方法,从而实现了动态地添加新的功能。

 

装饰器模式的优点是可以在不改变原始类的基础上,动态地为对象添加新的功能或行为,从而提高系统的扩展性和灵活性。它的缺点是可能会导致类的层次结构复杂,并且可能会导致代码的可读性和可维护性降低。

 12、【装饰器模式】动态地为对象添加新功能,业务逻辑,设计模式

 

总结

一、设计思想

装饰器模式的设计思想是将功能的添加与类的继承解耦。

二、实现原理

装饰器模式的实现原理是通过创建一个抽象装饰器类和具体装饰器类来实现的。

三、应用场景

装饰器模式适用于需要在不改变原始类的基础上,动态地为对象添加新的功能或行为的场景。例如:

1. 日志记录;

2. 性能监控;

3. 权限验证;

4. 数据加密;

 

讨论环节

为了方便你理解和巩固今天的内容,我给你留下两个讨论题,请在评论区与我一起讨论吧。

 

1. 装饰器模式的核心设计思想是什么?

2. 请说说你用过装饰器模式的场景?

 

如果觉得有收获,请双击支持,关注,后期我会持续更新更多相关知识。文章来源地址https://www.toymoban.com/news/detail-861529.html

到了这里,关于12、【装饰器模式】动态地为对象添加新功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C#12“实用”的新功能:类型的别名

    类型的别名是C#12的一种比较“实用”的“新功能”。它可以让你在开发过程中使用 using 别名指令创建任何类型的别名,也可以为元组类型、数组类型、指针类型或其他不安全类型创建语义别名,这样可以通过类型知道当前参数的含义,降低错误率。之前的C#版本也支持类型别

    2024年02月09日
    浏览(16)
  • C#12新功能主构造函数:实用,简洁利落

    大家还记得记录(record)类型吗?记录类型很像一个构造函数,那么类可以像record类型一样使用吗?C#12就推出了这样的功能,这就是主构造函数。“现在可以在任何 class 和 struct 中创建主构造函数。主构造函数不再局限于 record 类型。主构造函数参数都在类的整个主体的范围内

    2024年02月03日
    浏览(21)
  • 今天新发布的nova12手机都有哪些新功能?

    12月26日,华为召开问界M9及华为冬季全场景发布会,正式推出了华为nova 12系列新品,并宣布新的三款nova产品正式加入先锋计划~我们一起看下这次华为nova12系列有那些看点亮点呢?首先这次nova12 ultra 配置很高啊,智能可变光圈,双向北斗卫星消息,智感支付、智能快充10分钟快

    2024年02月03日
    浏览(25)
  • C++11 新功能

    在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为 C++11之前的最新C++标准名称。不过由于TC1主要是对C++98标准中的漏洞进行修复,语言的核心部分则没 有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C+

    2023年04月12日
    浏览(26)
  • Java 20 新功能介绍

    Java 20 共带来 7 个新特性功能 ,其中三个是孵化提案,孵化也就是说尚在征求意见阶段,未来可能会删除此功能。 JEP 描述 分类 429 作用域值(孵化器) Project Loom,Java 开发相关 432 Record 模式匹配(第二次预览) Project Amber,新的语言特性 433 switch 的模式匹配(第四次预览)

    2024年02月03日
    浏览(35)
  • Midjourney新功能:角色参照指南

    基本概念 角色参照(Character Reference) :这个功能允许用户在不同的图像生成中保持给定参照角色的一致性。 适用模型 :适用于Midjourney V6和Niji6型号。 功能亮点 跨风格一致性 :可以在不同风格(如动漫风、写实风)中保持角色特征一致。 面部、着装、发型调控 :用户可以

    2024年04月10日
    浏览(33)
  • 【C++】C++11 -- 新功能

    在C++11之前一个类有6个默认成员函数,在C++11标准中又新增了两个默认成员函数,分别是移动构造函数和移动赋值函数 默认移动构造和移动赋值生成的条件 移动构造函数的生成条件:没有自己实现移动构造函数,并且没有自己实现析构函数,拷贝构造函数和拷贝赋值函数 移

    2024年02月17日
    浏览(23)
  • TypeScript 5.1发布,新功能更新

    1:返回类型增加undefined 这里设置了一个别名 fun,当时使用它的时候,我们必须显示返回一个 undefined 。 现在你可以直接设置返回类型: 而不仅限于 void any 。 4.3版本 :❌ 5.1版本 :✅ 2:getter可以设置和 setter 的不相关类型 在之前版本 ,get 返回类型应该为 set 的子类型,如

    2024年02月09日
    浏览(18)
  • Microsoft Releases .NET 7新功能

    Microsoft Visual Studio是一种统一的开发体验,使开发人员能够跨web、云和设备创建多层应用程序。11月8日,微软发布了该强大开发环境的下一版本:Visual Studio 2022 17.4版。 除了修复许多顶级报告的bug之外,17.4版还包括了许多基于开发者社区建议的新功能,包括: Visual Studio的本

    2024年02月06日
    浏览(26)
  • 【C++】C++11类的新功能

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》 《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 默认成员函数 类成员变量初始化 强制生成默认函数的default 禁止生

    2024年04月17日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包