2.面向对象设计原则
(1)依赖倒置原则(DIP)
高层模块(稳定)不应该依赖底层模块(变化),二者都应该依赖于抽象(稳定)。
抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。
解决方案:提出抽象类
(2)开放封闭原则(OCP)
对扩展开放,对更改封闭。
类模块应该是可扩展的,但是不可修改。
(3)单一职责原则(SRP)
一个类应该i仅有一个引起他变化的原因。
变化的方向隐含着类的责任。
(4)Liskov替换原则(LSP)
子类必须能够替换他们的基类(is-a)
继承表达类型抽象.
(5)接口隔离原则(ISP)
不应该强迫客户程序依赖他们不用的方法。
接口应该小而完备。
(6)优先使用对象组合,而不是类继承
类继承是白箱复用,对象组合是黑箱复用
继承在某种程度上破坏了封装性,子类父类耦合度高。
(7)封装变化点
使用封装来创建对象间的分界层,让设计者可以在分界的一端进行修改而不影响另一端的使用
(8)针对接口编程,而不是针对实现编程
模板方法
稳定中有变化,主流程稳定,部分变化
流程12345,24是变化的
虚函数,多态
早绑定变成晚绑定
策略模式
应用会应用到多种算法,将算法放到应用中会比较麻烦,要将算法和应用解耦
旧版:违反开闭原则
算法变化,应用稳定
观察者模式
通知依赖关系,一个对象发生改变,所有依赖于它的对象都收到通知
比如进度条
旧版:违反依赖倒置原则,比如进度条的表现形式要变
装配器模式
多重继承导致代码变得复杂,出现很多重复的代码
通过使用组合而非继承的手法,装配器模式实现了在运行时动态扩展对象的能力。
一般来说继承于一个类,同时里面又有该类成员,多半是装配器模式。
桥模式
子类急剧膨胀,同时充斥着重复代码,关键是要划清责任
对象创建类型
对创建对象时用
工厂模式
定义一个创建对象的接口,让子类来确定新建哪个类
隔离类对象使用者和具体类型的耦合关系,将所要创建的具体对象工作延迟到了子类,从而实现扩展
抽象工厂:
一系列相互依赖对象的创建。工厂模式的话不能保证系列对象之间能相互匹配。(家族工厂)
工厂方法是抽象工厂的特例
原型模式:
工厂方法中将对象类和factory类合并,利用拷贝构造函数。
应对结构比较复杂的类,利用拷贝原型对象来创建新的对象。
对象性能模式:解决面向对象的成本过大的问题
单件模式:对于特殊的类,必须保证它们在系统中只有一个对象,单线程安全
考虑多线程,可以加锁来使得避免创建多个对象。
加锁,再判断是否为空,并新建对象。
改进版,加锁前再看看单例是否为空,可以避免使用锁,即双检查锁。但是由于内存读写reorder导致双检查锁不安全
正常来说new是:分配内存,调用构造器,把内存给目标指针,经过reorder后可能变成分配内存,把内存给目标,调用构造器
C++11后编译器支持atomic,使得内存分配不reorder