Day36【概念解析】装饰模式
目录 ▼
整理定义
中文名称:装饰模式/装饰器模式/装饰者模式
英文名称:Decorator Pattern
复述展开
What is decorator pattern?
【用自己的话进行复述】
📌 装饰模式是一种结构性对象设计模式,它允许动态地将行为添加到单个对象上,从而为类提供了扩展的功能。它的作用在于能够避免继承,同时不影响其他对象的行为。它的实现是通过创建一个包装对象来实现的,也就是对原有对象进行装饰和包装。
🌰*1
穿衣服就是一个典型的装饰模式的例子。你可以先穿打底衫,如果觉得冷,还可以套一件大外套,如果碰上下雨,再披个雨衣。所有的衣服都扩展了你的行为,但它们并不构成人的本身,如果不需要了,则可以随时脱掉。
🌰*2
在gRPC中的filter(过滤器)实际上也是一种装饰模式,它可以嵌套多个filter,每个filter都实现的是同一种接口,所有filter并不在意自己到底是纯粹的对象还是包装后的对象,所有的filter排列成一个栈,按照顺序执行各自的逻辑。
装饰模式结构

-
部件 (Component) 声明封装器和被封装对象的公用接口。
-
具体部件 (Concrete Component) 类是被封装对象所属的类。 它定义了基础行为, 但装饰类可以改变这些行为。
-
基础装饰 (Base Decorator) 类拥有一个指向被封装对象的引用成员变量。 该变量的类型应当被声明为通用部件接口, 这样它就可以引用具体的部件和装饰。 装饰基类会将所有操作委派给被封装的对象。
-
具体装饰类 (Concrete Decorators) 定义了可动态添加到部件的额外行为。 具体装饰类会重写装饰基类的方法, 并在调用父类方法之前或之后进行额外的行为。
-
客户端 (Client) 可以使用多层装饰来封装部件, 只要它能使用通用接口与所有对象互动即可。
优缺点
优点:
-
你无需创建新子类即可扩展对象的行为。
-
你可以在运行时添加或删除对象的功能。
-
你可以用多个装饰封装对象来组合几种行为。
-
单一职责原则。 你可以将实现了许多不同行为的一个大类拆分为多个较小的类。
缺点:
-
在封装器栈中删除特定封装器比较困难。
-
实现行为不受装饰栈顺序影响的装饰比较困难。
-
各层的初始化配置代码看上去可能会很糟糕。
理解体会
装饰模式实际上就是一种不改变原有对象,却能通过包装的方式增强原有对象的行为的设计模式。
在实际应用中,装饰模式常常用于以下场景:需要在运行时动态地添加功能到对象,或者需要在运行时动态地删除功能;不能使用继承来扩展功能,或者使用继承不方便的情况。
总的来说,装饰模式是一种非常有用的设计模式,它可以让我们在不修改原始类的情况下,动态地扩展对象的功能。然而,使用装饰模式也需要谨慎,因为它可能会增加系统的复杂性和理解难度。
参考
装饰设计(装饰者模式 / 装饰器模式) (refactoringguru.cn)