关于装饰器设计模式

Posted

技术标签:

【中文标题】关于装饰器设计模式【英文标题】:About Decorator design pattern 【发布时间】:2013-11-28 02:32:01 【问题描述】:

实际上我有一个的演示。我确信我已经在 java 和 c# 中使用过它几次,问这个问题的目的是我没有得到一些真实世界的简单示例,我可以通过这些示例轻松地向我的听众介绍这一点。谁能帮帮我?

【问题讨论】:

en.wikipedia.org/wiki/Decorator_pattern ***.com/questions/2707401/…。查看 java.io.FileInputStream 和 java.io.BufferedInputStream 示例。 ***.com/questions/6366385/decorator-pattern-for-io 【参考方案1】:

I/O 流是装饰器模式在两种语言中的经典示例

【讨论】:

【参考方案2】:

装饰器模式的目的是让您通过“包装”原始对象的类型来动态扩展对象的行为。

在 .NET Framework 中,这种“包装”的常见示例是 Stream 类及其所有变体,例如 BufferedStreamCryptoStream

BufferedStream 扩展了Stream 类,通过读取和写入大块数据字节以获得比普通Stream 更好的性能;而CryptoStream 通过动态加密和解密数据字节来扩展Stream 类以确保安全。两者仍然是流,因为它们可以执行流可以执行的所有操作,例如读取、写入、查找等。

装饰器类通常有一个带有参数的构造函数,该参数表示它们打算装饰的类型,例如:

new BufferedStream(Stream stream);

【讨论】:

【参考方案3】:

您可以找到接受的答案here。

但是,如果您不理解该链接上的答案,这里有一个简单的说明,我想到了现实世界的装饰是如何工作的。顾名思义,装饰器就像现实世界中的装饰品。

想象一个大球。你想制作一个带有一些迷彩图案和一些图案和贴纸的球。 应该很简单。

球厂

首先,您将有一个Ball Factory(或创建者)产生黑色(或透明,无所谓)的球。微不足道。

红彩球工厂

您希望球的底色为红色。所以在Ball Factory 完成球后,RedColorBall Factory 会将球涂成红色,然后还给你。这又是微不足道的。

BluePatternBall 工厂

几天后,您认为生产的球需要有蓝色迷彩图案。所以RedColorBall Factory返回红球后,BluePatternBall Factory会画一个蓝色的图案并返回给你。

GreenStripeBall 工厂

几天后,您认为球需要有绿色条纹和红色底色(这很奇怪,不要问)。但它需要在涂完红色底色之后,在涂蓝色图案之前涂上。所以你创建了GreenStripeBall Factory 并将其定位在RedColorBall Factory 之后和BluePatternBall Factory 之前。

芝加哥公牛贴纸工厂

那么最后你需要一个芝加哥公牛队(随机选择,不要评判我)贴纸。然后你制作ChicagoBullsStickerFactory,并把它放在BluePatternBallFactory之后的最后。然后你会得到red-based with green stripe and blue camo pattern ball with chicago bulls sticker

以后如果你需要在球上添加一些图案或其他贴纸,你只需要创建另一个工厂并将它放在它们之前/之后或它们之间。

【讨论】:

以上是关于关于装饰器设计模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习之:装饰器模式

为啥装饰器模式适用于指针而不适用于引用?

Day807.装饰器模式 -Java 性能调优实战

装饰器、包装器和适配器模式之间有啥区别?

Ruby on Rails 模式 - 装饰器与演示器

设计模式—— 十七:装饰器模式