Boolan C++设计模式一
设计模式:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。——Christopher Alexander
八大设计原则:
Template Method:
应用程序开发人员使用lib时,由于lib的开发人员已经写好程序的主流程和部分步骤的具体实现(这些是相对稳定的), 应用开发人员只需对lib的类进行继承,并重写部分(override)它的成员函数(推荐为protdected类型,不被外界直接调用)即可。(晚绑定)。
前提是有稳定和不稳定的成分,设计模式才有用武之地。如果全部都稳定,或是全部都不稳定,那么就不能使用设计模式。
设计模式看类图时,要找到其中稳定和变化的部分。
library说:“你(应用程序)不要调用我(library),让我调用你!”
虚函数和函数指针都是晚绑定。
Strategy:
要动态的看问题,而不只是静态的看待问题。加上时间轴,考虑到未来的变化
使用多态的变量(类内和类外),要用指针。
为解决同一个问题的不同算法设计一个类,并实现各种的计算方法,当有新的算法时,则扩展算法(定义新的类来实现)。不同算法之间可以相互替换(变化)。
如果if...else if...是绝对稳定的,那么大部分可以采用strategy method。
优点:当存在一些无用的算法时, 代码具有良好的本地性,加载的代码,就是调用相应的哪个实现方法,但利用if..else if...他们也会加载这些无用的算法到代码段,影响性能。
Observer:
编译时依赖。违背依赖倒置原则。
c++支持多继承,最好一个是主基类,其他的都是接口类。
对象间一对多的依赖关系,一个对象的状态变化时,所有依赖于它的对象得到通知,并各自自动更新。
目标和观察者独立更改,松耦合。
目标自动发送通知,无需指定观察者。
观察者自己决定是否订阅通知,不订阅通知就不用将这个观察者放入到目标虽维护的对象集合。目标无需知道观察者是否订阅了通知。
单一职责原则表现突出的模式
Decorator:
组合-->继承;编译时-->运行时的多态;使用时,编译时装饰-->运行时装饰。
CryptoStream继承于Stream,并拥有一个Stream的指针(使用这种方法99%都是decorator模式)。继承是为了继承接口,完善接口规范,指针是为了实现运行时多态,实现具体的类。
当多个类继承于同一个类时,多个类的相同的成员应该提到基类中,如果其中有些子类并不使用某些基类数据成员,这时就可以将这些数据成员放入一个中间类(DecoratorStream)中.
主体操作和扩展操作应该分开继承。
Bridge:
类的数目1+n+n*m-->1+n+m
当多个类继承同一个类,基类中有一些不被子类重写的成员函数时,可将基类拆分成两个类。(Messager和MessageImp)
抽象部分(平台实现)和实现部分(业务实现),多个变化维度分离,使他们可以独立变化。