2

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

4

3 回答 3

1

您可以在此处找到可接受的答案。

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

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

球厂

首先,您将有一个Ball Factory(或创建者)产生黑色(或透明,没关系)的球。够琐碎的。

红彩球厂

您希望球具有红色基色。所以在Ball Factory完成球后,然后RedColorBall Factory将其涂成红色,然后将其归还给您。这又是微不足道的。

蓝纹球厂

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

绿条球厂

几天后,您认为球需要有绿色条纹和红色底色(这很奇怪,不要问)。但它需要在涂完红色底色之后,在涂蓝色图案之前涂上。因此,您将其GreenStripeBall Factory放置在 之后RedColorBall Factory和之前BluePatternBall Factory

芝加哥公牛贴纸厂

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

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

于 2013-11-15T02:50:20.220 回答
0

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

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

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

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

new BufferedStream(Stream stream);
于 2013-11-14T21:30:04.550 回答
0

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

于 2013-11-14T21:16:12.837 回答