type
status
date
slug
summary
tags
category
icon
password
整理定义
中文名称:装饰模式/装饰器模式/装饰者模式
英文名称:Decorator Pattern
出处 | 定义 |
中国大百科全书 | 在对象中动态地加入新的职责,同时避免继承出大量的子类的一种设计模式,从而提供了一种动态扩展类的功能的方法 |
设计模式 | 装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 |
百度百科 | 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 |
维基百科 | In object-oriented programming, the decorator pattern is a design pattern that allows behavior to be added to an individual object, dynamically, without affecting the behavior of other objects from the same class.[1] The decorator pattern is often useful for adhering to the Single Responsibility Principle, as it allows functionality to be divided between classes with unique areas of concern[2] as well as to the Open-Closed Principle, by allowing the functionality of a class to be extended without being modified.[3] Decorator use can be more efficient than subclassing, because an object's behavior can be augmented without defining an entirely new object.
【在面向对象编程中,装饰器模式是一种设计模式,允许动态地将行为添加到单个对象,而不影响同一类中其他对象的行为。 装饰器模式通常对于遵守单一职责原则很有用,因为它允许在具有独特关注领域的类之间划分功能,并且通过允许类的功能被 扩展而不修改。装饰器的使用比子类化更有效,因为无需定义全新的对象即可增强对象的行为。】 |
复述展开
What is decorator pattern?
【用自己的话进行复述】
装饰模式是一种结构性对象设计模式,它允许动态地将行为添加到单个对象上,从而为类提供了扩展的功能。它的作用在于能够避免继承,同时不影响其他对象的行为。它的实现是通过创建一个包装对象来实现的,也就是对原有对象进行装饰和包装。
🌰*1
穿衣服就是一个典型的装饰模式的例子。你可以先穿打底衫,如果觉得冷,还可以套一件大外套,如果碰上下雨,再披个雨衣。所有的衣服都扩展了你的行为,但它们并不构成人的本身,如果不需要了,则可以随时脱掉。
🌰*2
在gRPC中的filter(过滤器)实际上也是一种装饰模式,它可以嵌套多个filter,每个filter都实现的是同一种接口,所有filter并不在意自己到底是纯粹的对象还是包装后的对象,所有的filter排列成一个栈,按照顺序执行各自的逻辑。
装饰模式结构
- 部件 (Component) 声明封装器和被封装对象的公用接口。
- 具体部件 (Concrete Component) 类是被封装对象所属的类。 它定义了基础行为, 但装饰类可以改变这些行为。
- 基础装饰 (Base Decorator) 类拥有一个指向被封装对象的引用成员变量。 该变量的类型应当被声明为通用部件接口, 这样它就可以引用具体的部件和装饰。 装饰基类会将所有操作委派给被封装的对象。
- 具体装饰类 (Concrete Decorators) 定义了可动态添加到部件的额外行为。 具体装饰类会重写装饰基类的方法, 并在调用父类方法之前或之后进行额外的行为。
- 客户端 (Client) 可以使用多层装饰来封装部件, 只要它能使用通用接口与所有对象互动即可。
优缺点
优点:
- 你无需创建新子类即可扩展对象的行为。
- 你可以在运行时添加或删除对象的功能。
- 你可以用多个装饰封装对象来组合几种行为。
- 单一职责原则。 你可以将实现了许多不同行为的一个大类拆分为多个较小的类。
缺点:
- 在封装器栈中删除特定封装器比较困难。
- 实现行为不受装饰栈顺序影响的装饰比较困难。
- 各层的初始化配置代码看上去可能会很糟糕。
理解体会
装饰模式实际上就是一种不改变原有对象,却能通过包装的方式增强原有对象的行为的设计模式。
在实际应用中,装饰模式常常用于以下场景:需要在运行时动态地添加功能到对象,或者需要在运行时动态地删除功能;不能使用继承来扩展功能,或者使用继承不方便的情况。
总的来说,装饰模式是一种非常有用的设计模式,它可以让我们在不修改原始类的情况下,动态地扩展对象的功能。然而,使用装饰模式也需要谨慎,因为它可能会增加系统的复杂性和理解难度。
参考
快速跳转链接
【概念解析】启动
【概念解析】Day 1 - 10
【概念解析】Day 11 - 20
【概念解析】Day 21 - 30
【概念解析】Day 31 - 40
【概念解析】Day 41 - 50
【概念解析】Day 51 - 60
【概念解析】Day 61 - 70
【概念解析】Day 71 - 80
【概念解析】Day 81 - 90
- 作者:eachenkuang
- 链接:https://kuangyichen.com/article/industry-day36
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。