实际上我有一个关于装饰器设计模式的介绍。我确信我已经在 java 和 c# 中使用过它几次,问这个问题的目的是我没有得到一些真实世界的简单示例,我可以通过这些示例轻松地向我的听众介绍这一点。谁能帮我吗?
3 回答
您可以在此处找到可接受的答案。
但是,如果您不理解该链接的答案,这里有一个简单的说明,我想到了现实世界的装饰是如何工作的。顾名思义,装饰器就像现实世界中的装饰品。
想象一个大球。你想制作一个带有一些迷彩图案和一些图案和贴纸的球。应该足够简单。
球厂
首先,您将有一个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
.
稍后如果您需要在球上添加一些图案或其他贴纸,您只需创建另一个工厂并将其放在之前/之后或它们之间。
装饰器模式的目的是让您通过“包装”原始对象的类型来动态扩展对象的行为。
在 .NET Framework 中,这种“包装”的常见示例是Stream
类及其所有变体,例如BufferedStream
和CryptoStream
.
通过读取和写入大块数据字节来BufferedStream
扩展类,以获得比普通更好的性能;同时通过动态加密和解密数据字节来扩展类以确保安全。两者仍然是流,因为它们可以执行流可以执行的所有操作,例如读取、写入、查找等。Stream
Stream
CryptoStream
Stream
装饰器类通常有一个带有参数的构造器,该参数表示它们打算装饰的类型,例如:
new BufferedStream(Stream stream);
I/O 流是装饰器模式在两种语言中的经典示例