C++设计模式 - 总结
一个目标:管理变化,提高复用
掌握设计模式一个核心目标:管理变化,提高复用。在使用设计模式中发现并没有实现复用,这就和设计初衷相违背了,说明代买写的不好。
两种手段:分解VS.抽象
在代码设计中,该开始想要怎样面向对象先要分解,比如这是梨,这是苹果,这是香蕉建立这杨分解的思维,知道它们不同。但是呢我们很快建立抽象的思维,知道这一类都归属水果,然后就可以在思维管理里面或程序管理里面针对抽象进行统一的管理,比如水果有哪些功能的特征。
八大原则
- 依赖倒置原则(DIP)
- 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。
- 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。
- 开放封闭原则(OCP)
- 对扩展开放,对更改封闭。
- 类模块应该是可扩展的,但是不可修改。
- 单一职责原则(SRP)
- 一个类应该仅有一个引起它变化的原因。
- 变化的方向隐含着类的责任。
- Liskov 替换原则(LSP)
- 子类必须能够替换它们的基类(IS-A)。
- 继承表达类型抽象。
- 接口隔离原则(ISP)
- 不应该强迫客户程序依赖它们不用的方法。
- 接口应该小而完备。
- 优先使用对象组合,而不是类继承
- 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。
- 继承在某种程度上破坏了封装性,子类父类耦合度高。
- 而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。
- 封装变化点
- 使用封装来创建对象之间的分界层,让设计者可以在分界层的
- 一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。
- 针对接口编程,而不是针对实现编程
- 不将变量类型声明为某个特定的具体类,而是声明为某个接口。
- 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
- 减少系统中各部分的依赖关系,从而实现”高内聚、松耦合"的类型设计方案。
重构技法
- 静态 → 动态
- 早绑定→ 晚绑定
- 继承→ 组合
- 编译时依赖→ 运行时依赖
- 紧耦合→ 松耦合
从封装变化角度对模式分类
C++ 对象模型
几乎所有模式都归属第三种结构。继承和组合在C++内存模型上没有太大的区别,所以慎用继承,优先组合,不过是带指针的组合,如果是第二种会发生对象切割,而用指针更灵活,还可以指向它的子类。从耦合性来看,前两种是紧耦合,第三种松耦合。
关注变化点和稳定点
设计模式的宗旨是:管理变化,提高复用。如果是所有都是变化的或稳定的,那用设计模式也没有意义,设计模式是在管理变化实现稳定与变化隔离。
什么时候不用模式
- 代码可读性很差时
- 需求理解还很浅时
- 变化没有显现时
- 不是系统的关键依赖点
- 项目没有复用价值时
- 项目将要发布时
经验之谈
- 不要为模式而模式
- 关注抽象类&接口
- 理清变化点和稳定点
- 审视依赖关系
- 要有Framework和Application的区隔思维
- 良好的设计是演化的结果
设计模式成长之路
- “手中无剑,心中无剑”: 见模式而不知
- “手中有剑,心中无剑”: 可以识别模式,作为应用开发人员使用模式
- “手中有剑,心中有剑”: 作为框架开发人员为应用设计某些模式
- “手中无剑,心中有剑”: 忘掉模式,只有原则
参考:李建忠C++设计模式视频
C++设计模式 - 总结的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- java 设计模式
目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- 【JOISC 2020 补题记录】
目录 Day 1 Building 4 Hamburg Steak Sweeping Day 2 Chameleon's Love Making Friends on Joitter is Fun R ...
- Solution Set -「ARC 107」
「ARC 107A」Simple Math Link. 答案为: \[\frac{a(a+1)\cdot b(b+1)\cdot c(c+1)}{8} \] 「ARC 107B」Quadrup ...
- php使用CURL实现GET和POST方式请求
CURL请求,支持GET和POST两种方式,默认为GET方式,如果传第二个参数则为POST方式请求,设置了超时时间,避免程序卡死. /** 使用curl方式实现get或post请求 @param $u ...
- Dubbo服务注册到Zookeeper,对外提供服务的实际类 ref(如:SleepServiceImpl)保存在哪里
Dubbo服务注册到Zookeeper,其注册的内容为实际对外提供的服务的实现.这个实现保存在哪里(至于具体客户端使用时怎么取后后续阐述)?可以看看Dubbo如何处理的. 对于@DubboServic ...
- LibOpenCM3(二) 项目模板 Makefile分析
目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3 项目模板 项目模板地址: https://githu ...
- 基于nodejs的阿里云DDNS服务,支持多网卡绑定
前段几天写的,自用. 想着也许有和我一样需求的同学,所以开源发出来了. 提供阿里云的DDNS设置,支持多网卡多域名绑定. 特性 支持阿里云DDNS设置 支持针对多个线路多个网卡单独设置域名 支持IPv ...
- 防世界之Web_warmup
题目: 啥都没有,右键打开页面源代码查看一下 发现source.php源文件,输入http://111.200.241.244:53776/source.php看看 <?php high ...
- 开源爱好者月刊《HelloGitHub》第 71 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- windbg调试命令
重要 (1) windbg命令分为标准命令(40个左右),元命令(一百多个)和扩展命令. 标准命令提供最基本的调试功能,不区分大小写.如:bp g dt dv k等 元命令提供标准命令没有提供的功能, ...
- 深度剖析数仓CN增量备份技术
摘要:为了解决Roach的性能问题,提出了CN增量备份手段,从而达到进一步优化RPO目的. 本文分享自华为云社区<GaussDB(DWS)备份容灾之CN增量备份>,作者: zxy_db . ...