一、组件协作模式之策略模式
1.动机:软件构造的过程中某些对象使用的算法可能是多种多样的,会经常改变。如果将算法都编码到对象中,将会使对象变得异常复杂。有时支持不使用的算法也是一种负担(多余算法代码被装载到内存而不被使用,就是一种负担,不是stratrgy的顺带好处,这方面主要不是他解决)。
若不使用策略模式,会违反面向对象设计原则中的开闭原则:对拓展开放,对修改封闭。也就是使用拓展的方式去迎接需求,而不是使用修改源代码的方式。
2.模式定义:定义一些列算法把他们一个个封装起来,并且使他们可以相互替换(算法之间的替换以及对单个算法的替换)。该模式使得算法可独立于使用它的客户程序而变化。
3.要点总结
-
Strategy及其子类为组件提供了一系列可重用的算法。从而使类型在运行时方便地根据需要在各个算法之间进行切换。
-
strategy模式提供了用条件判断语句以外的另一种使用选择。消除判断语句,就是在解耦合。
拓展:代码中出现if else/switch case常常是需要使用Strategy的一种特征。if else/switch case是结构化时代分而治之的方式,列举的是现有已知的情况,无法应对变化(原则或者应对变化的方式就是在源代码中进行修改,违背开闭原则)。只有在if else/switch case是绝对不变的情况下(比如一周只有七天),可以不考虑strategy模式。
- 如果strategy对象没有实例变量,那么各个上下文可以享受同一个strategy对象,从而节省对象开销。
二、散装问题、知识点
1.看问题考虑到时间变化,而不是静态的看问题
2.任何一个基类都需要添加一个虚类的析构函数,编译器虽然会自动生成,但是如果不写在多态的delete时会出问题。
指针就是多态的体现之一:能指向不同的函数实现不同的功能
引用也是多态度的体现之一
3.C++中规范写法是将一个文件存放一个类
4.虚函数是什么?
5.引用的缺点是什么?
6.C++中的继承是使用“:”
7.增量编译是什么?
8.面向对象的复用性是在二进制层面的复用,是编译层面的。也就是编译部署测试之后,不对源代码进行修改实现需求变更
9.除了单例模式,任何一个设计模式都可以找出变化以及稳定的部分