其他设计模式 23种设计模式(C++)

每一种都有对应理解的相关代码示例 → Git原码

单一职责

在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。

Decorator

动机(Motivation)

  • 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。

  • 如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?

模式定义

​ 动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 & 减少子类个数)。

​ ——《设计模式》GoF

结构(Structure)

要点总结

  • 通过采用组合而非继承的手法, Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免 了使用继承带来的“灵活性差”和“多子类衍生问题”。

  • Decorator类在接口上表现为is-a Component的继承关系,即 Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了 另外一个Component类。

  • Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。

Bridge

动机(Motivation)

  • 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。

  • 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

模式定义

​ 将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。

​ ——《设计模式》GoF

结构(Structure)

要点总结

  • Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固 有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。

  • Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。

  • Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。

最新文章

  1. CSharpGL(4)设计和使用Camera
  2. Java动态代理全面分析
  3. 转载自安卓巴士 【收藏】2015必须推荐的Android框架,猿必读系列!
  4. 居于集成了adt的Android 开发环境配置
  5. 边工作边刷题:70天一遍leetcode: day 84-3
  6. Java-人民币转成大写
  7. 20145317彭垚 《Java程序设计》第5周学习总结
  8. saiku-添加数据源以及保证数据源的一致性
  9. centos 安装http协议的git server
  10. wamp 提示 Directive allow_call_time_pass_reference is no longer avaiable in PHP
  11. Centos下删除文件名乱码文件
  12. 基于简单sql语句的sql解析原理及在大数据中的应用
  13. main真正的形状函数
  14. thrift实现HDFS文件操作
  15. servlet三大作用域对象
  16. Directory of X:\EFI\Microsoft\Boot
  17. ubuntu14.04 中virtual box 加入 usb
  18. beta冲刺————第五天(5/5=1)
  19. Laravel中pluck的使用——返回指定的字段值信息列表
  20. 练习:自己写一个容器ArrayList集合 一一数组综合练习2

热门文章

  1. luogu P3180 [HAOI2016]地图 仙人掌 线段树合并 圆方树
  2. x86架构:保护模式下利用中断实现抢占式多任务运行
  3. js的栈内存和堆内存
  4. linux之DNS主域,从域,缓存服务器的架设
  5. 提交项目到码云上git的使用
  6. python3.2求和与最值
  7. JS 模仿京东键盘输入内容
  8. 浅析Facebook LibraBFT与比原链Bystack BBFT共识
  9. Prometheus Operator 教程:根据服务维度对 Prometheus 分片
  10. java 增强for循环与泛型