C++ 结构性设计模式文字总结 Structural Design Patterns

Adapter 适配器

问题: 有一个方形钉子和一个圆形的洞,想把方形钉子插入圆形的洞怎么办?
解决方案:

  1. 创造一个适配器,继承圆形钉子,这样此适配器可以放入圆形的洞。
  2. 适配器用方形钉子作为参数,创造出圆形钉子。
  3. 这样方形钉子可以放入适配器中,适配器可以放入圆形洞中,完成了适配。

Bridge 桥梁

问题: 有一些电视,有一些遥控器,如何让每个遥控器都可以随便控制哪个电视?
解决方案:

  1. 使所有电视都继承一个设备类。
  2. 在遥控器类中放入一个设备的引用。
  3. 遥控器和电视配对时,将电视的引用放入遥控器。
  4. 遥控器调用什么功能的时候直接调用存储在类中的设备类的方法即可,即可实现不用改变遥控器代码也能遥控所有电视。

Composite 组合

问题: 有一些图形(点、线、圆)可以任意组合成一个组合,点、圆和组合之间也可以任意组合。想调用一次函数把属于这个组合的所有图形都绘制出来,如何实现?
解决方案:

  1. 所有图形和组合都继承自同一个图形接口,包含绘制和移动函数。
  2. 图形的绘制函数即绘制自身。
  3. 组合要创建添加图形的函数和区域,因为图形和组合都继承自同样的接口,所以他们可以放在同样的位置。
  4. 组合的绘制函数遍历其存储的图形和组合,递归完成绘制。

其实就像数据结构里数的前序遍历一样

Decorator 装饰者

问题: 有一个文件类,可以根据写数据到磁盘,或者从磁盘读取数据。可现在要求对数据进行压缩,如何实现?
解决方案:

  1. 新建装饰类继承文件类的接口,将接口的引用作为成员变量。这样装饰类可以调用文件类。
  2. 装饰类以文件类作为构造函数参数。
  3. 在需要调用文件类的函数时,直接调用装饰类,装饰类先压缩/解压数据,再调用原有的函数写/读文件。
  4. 这样完成了对读写的装饰。因为继承的都是同一个接口,所以客户端在调用文件类时,并不知道其细节,无需更改代码。

Facade 外观

问题: 有一个复杂的第三方视频转化框架,需要调用其中的其中一部分功能,如果直接在客户端中调用初始化这些功能,会导致第三方代码和自己的代码耦合过紧,如何处理?
解决方案:
新建一个类,集中初始化处理需要用到的功能,简化复杂的第三方库。这样第三方库更改时,也无需更改自己的主题逻辑,只需更改外观对象。

Flyweight 共享

问题: 在一个游戏中,有一片深林,需要种树,如果每个树都拥有单独的纹理,内存占用将变得不可接受,如何处理?(感觉这个问题有点过于简单…
解决方案:

  1. 创建一个树的纹理类,包含不同数的纹理,不同纹理只存在一个实例。
  2. 创建一个树类,包含纹理类的指针或者引用,以及X、Y坐标。
  3. 创建一个造树工厂,根据需求的不同的树的类型,返回树的实例。
  4. 深林在造树的时候,把需要树的类型告诉造树工厂,工厂返回树的实例,将树的实例种植下去。

Proxy 代理

问题: Bilibili在部署的时候,有些客户端不断地请求下载相同的视频,对资源造成巨大的浪费,如何避免?
解决方案:

  1. 创建代理类,继承和Bilibili相同的接口。
  2. 划分区域存储Bilibili主体的引用。
  3. 当客户端请求下载一个视频的时候,代理将视频缓存下来。
  4. 若客户端再次请求相同视频,代理直接将视频返回,不通知Bilibili主体,实现资源节省。

代理模式和装饰者模式很接近,我的理解是:代理模式对主体的掌控更加深入,能够代表主体的行为,而装饰者模式只能对行为进行嵌套。

以上例子都来源于《Dive Into DESIGN PATTERNS》一书。
本文只是简单对例子进行总结,更多相互关联和实用场景并未阐述完整,如有需要,请阅读此书。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值