-
单一职责原则
-
一个类只有一个职责,不应既做这又做那,这样的好处是:
-
降低了类的复杂性
-
提高了代码的可读性,可维护性
-
降低了因变更带来的风险
-
-
里氏替换原则
-
一个子类必须实现父类的所有方法
-
一个子类可以拥有父类没有的方法
-
在所有需要父类对象的地方都可以用子类的对象替换而不会出现问题
-
-
依赖倒置原则
-
高层模块不应该依赖底层模块
-
抽象不应该依赖于细节
-
实现应该依赖于抽象
- 面向接口编程
-
-
接口隔离原则
- 一个类可以有多个方法,但如果打算向外部提供部分方法,则把这些方法实现为接口,返回接口类型
-
迪米特法则
- 最少知识法则
- 只与你直接的朋友通信
- 一个类不应该与过多的类发生联系
- 如果一个类需要调用第三个类的方法,可以加入中间者,转发调用这个方法
-
开关原则
- 最重要的一个核心原则
- 一个软件实体应该对扩展开放,对修改封闭
-
组合优先于继承
-
把变与不变的事物分开
-
委托,委托,委托
-
你不会用到它
目前随着编程语言的进步,很多模式已经没有存在的必要了!
设计模式是某种程度上类C++这种静态语言在动态性方面的不足,随着各种语言动态性的增强(C++的function+bind),很多模式已经没有存在的必要了(参考陈硕的《Linux多线程服务端编程》)
1 创建型模式
抽象工厂Abstract Factory 1-1
意图:用工厂类的不同成员函数来返回不同类型的对象。这样一来用户不必记住各个类的名字。
这个模式有个明显的问题:添加新类要修改原来的代码!
工厂方法Factory Method 1-2
意图:定义一个创建对象的接口,让子类决定实例化哪一个类
这个模式就是想突破抽象工厂修改源代码的问题。使用C++模板就可以轻松实现新类型的创建工作
抽象工厂与工厂方法可以被std::function+std::bind代替,所以不再需要大动干戈的设计工厂方法了,参考下面的链接:
另外std::make_pair std::make_shared 均可以理解为工厂方法。
单利模式Singleton 1-5
意图:保证一个类仅有一个实例,并提供一个全局访问点。
多线程的单利需要加锁访问instance()方法,关于加锁的示例代码参考:多线程同步的开发
例子: Boost中的单利模式2 结构型模式
适配器模式Adapter 2-1
意图:将一个类的接口转换为客户希望的另一个接口。
例子:用deque实现栈或者队列
桥接模式Bridge 2-2
意图:将抽象部分与实现部分分离,使它们都可以独立的变化。(核心在抽象,为了应对变更才有了不同的实现)
例子:Windows各种窗口使用成员指针来指向具体的实现类
组合模式Composite 2-3
意图:将对象组合成树形结构以表示“整体-部分”的层次结构,组合模式使得用户对单个对象的使用和组合对象的使用具有一致性。
例子:表达式求值(一元运算表达式、二元运算表达式、叶子节点)
代理模式Proxy 2-7
意图:为对象提供一种代理以控制对这个对象的访问。(核心是被代理对象,通常是控制创建、初始化、释放等)
例子:智能指针,shared_ptr基本用法 weak_ptr基本用法
3 行为模式
观察者模式Observer 3-7
策略模式Strategy 3-9
意图:定义一个系列算法,把他们一个个封装起来,并且使它们可互相替换。使得算法可以独立于使用它的客户。
策略模式本质上等价于工厂方法模式。可以通过多态来实现随意指定哪个算法。将来增加了新的算法,原来的程序正常运行。
例子:策略模式Strategy