网站突然打不开wordpress连阿里云域名
2026/1/23 20:33:51 网站建设 项目流程
网站突然打不开,wordpress连阿里云域名,怎样自己做网站赚钱,南昌有没有做企业网站和公司设计模式[9]——装饰器模式一分钟彻底说透 一句话定义 在不修改原有对象的前提下#xff0c;运行时动态、透明地给对象层层添加额外行为#xff0c;保持接口不变。 软件领域真实例子#xff1a;网络数据流处理#xff08;超级常见#xff01;#xff09; 场景#x…设计模式[9]——装饰器模式一分钟彻底说透一句话定义在不修改原有对象的前提下运行时动态、透明地给对象层层添加额外行为保持接口不变。软件领域真实例子网络数据流处理超级常见场景你有一个基本的网络 Socket 发送数据但实际项目中经常需要层层叠加功能先加密Encryption再压缩Compression再加日志记录Logging最后才真正发送客户端代码只关心stream-write(data)完全不知道中间加了多少层处理不用装饰器会怎样继承爆炸classEncryptedSocket:publicSocket{...}classEncryptedCompressedSocket:publicEncryptedSocket{...}classEncryptedCompressedLoggedSocket:publicEncryptedCompressedSocket{...}// 3种功能 → 8种子类明天加“校验和”功能直接崩溃。很多人困惑这不就是普通的继承多态吗错得离谱下面这张表10秒彻底撕开项目普通继承多态你觉得像的装饰器模式真相添加行为时机静态编译时固定在子类里动态运行时随意叠加、顺序随意、数量随意类数量功能组合爆炸2^n 个子类只有 n 1 个类基础 n种装饰灵活性想临时加/减一层功能不可能运行时随意包装想加双重加密包两层就行关系本质is-aEncryptedSocket “是一种” Sockethas-a装饰器“持有”一个被装饰的对象软件真实场景固定类型TcpSocket、UdpSocket临时增强加密流、压缩流、日志流、缓冲流口号“焊死在子类里”“运行时层层叠加想加就加想拆就拆”狠话继承是生孩子——生完就定型装饰器是穿外套——想穿几件、哪件先穿都行还能脱真实软件代码现代 C20网络流处理#includeiostream#includememory#includestring#includevectorusingnamespacestd;// 1. 统一数据流接口classDataStream{public:virtual~DataStream()default;virtualvoidwrite(constvectoruint8_tdata)0;virtualstringname()const0;// 用于调试描述};// 2. 基础流真正干活的核心classTcpSocketStream:publicDataStream{public:voidwrite(constvectoruint8_tdata)override{cout[TcpSocket] 真正发送数据长度: data.size() 字节endl;}stringname()constoverride{returnTCP Socket;}};// 3. 装饰器基类关键持有一个流指针classStreamDecorator:publicDataStream{protected:unique_ptrDataStreamstream;// ← 包装链的核心public:explicitStreamDecorator(unique_ptrDataStreams):stream(move(s)){}stringname()constoverride{returnstream-name();// 默认转发子类可追加}};// 4. 具体装饰器真实功能classLoggingDecorator:publicStreamDecorator{public:explicitLoggingDecorator(unique_ptrDataStreams):StreamDecorator(move(s)){}voidwrite(constvectoruint8_tdata)override{cout[Logging] 记录写操作数据大小: data.size()endl;stream-write(data);// 转发给下一层}stringname()constoverride{returnstream-name() Logging;}};classCompressionDecorator:publicStreamDecorator{public:explicitCompressionDecorator(unique_ptrDataStreams):StreamDecorator(move(s)){}voidwrite(constvectoruint8_tdata)override{cout[Compression] 正在压缩数据... (原大小 data.size() - 压缩后 data.size()/2)endl;autocompressedcompress(data);// 模拟压缩stream-write(compressed);}stringname()constoverride{returnstream-name() Compression;}private:vectoruint8_tcompress(constvectoruint8_td){return{1,2,3};}// 简化};classEncryptionDecorator:publicStreamDecorator{public:explicitEncryptionDecorator(unique_ptrDataStreams):StreamDecorator(move(s)){}voidwrite(constvectoruint8_tdata)override{cout[Encryption] 正在AES加密数据...endl;autoencryptedencrypt(data);// 模拟加密stream-write(encrypted);}stringname()constoverride{returnstream-name() Encryption;}private:vectoruint8_tencrypt(constvectoruint8_td){return{9,9,9};}// 简化};客户端运行时随意组装流intmain(){vectoruint8_tpayload{1,2,3,4,5,6,7,8,9,0};// 场景1生产环境 - 全功能autostreammake_uniqueTcpSocketStream();streammake_uniqueLoggingDecorator(move(stream));streammake_uniqueCompressionDecorator(move(stream));streammake_uniqueEncryptionDecorator(move(stream));cout当前流: stream-name()endl;// TCP Socket Logging Compression Encryptionstream-write(payload);// 场景2调试环境 - 只加日志不加密不压缩autodebugStreammake_uniqueTcpSocketStream();debugStreammake_uniqueLoggingDecorator(move(debugStream));debugStream-write(payload);// 场景3想双重加密轻松autosecureStreammake_uniqueTcpSocketStream();secureStreammake_uniqueEncryptionDecorator(move(secureStream));secureStreammake_uniqueEncryptionDecorator(move(secureStream));// 双重加密secureStream-write(payload);}C 真实项目里到处都是装饰器标准库std::ostream→std::ofstream→std::stringstream层层包装Boost.Asiosocket → ssl::stream → buffered_streamQtQWidget → QScrollArea滚动条装饰 → CustomBorderDecorator游戏网络Packet → CRCDecorator → EncryptDecorator → CompressDecorator → Send日志库Logger → FileWriter → AsyncDecorator → RotateDecorator终极口诀软件人专属“功能运行时叠层层包装不继承接口不变真优雅加密压缩随便配”刻在DNA里的一句话当你在软件中需要“运行时给一个流/对象临时叠加多个处理行为”日志、加密、压缩、缓冲等且组合方式多变时别用继承爆炸用装饰器——层层包装接口统一灵活到极致现在装饰器模式在纯软件场景下彻底说透了吧这才是程序员每天都在用的真实模式下一期要外观模式Facade它专门治“子系统太复杂”的病

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询