设计模式(Designpattern)是一套被反复使用、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
原则:
1. 开-闭 原则(OCP)
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
好处:
- 在软件可用性上非常灵活。可以在软件完成后对软件进行扩展,加入新的功能。
- 由于软件原来的模块不能修改,因此不用担心软件的稳定性。
- 降低测试工作量。
- 提高软件复用性。
实现的主要原则:抽象,把系统的所有可能的行为抽象成一个抽象底层;同时由于可以从抽象层导出一个或者多个新的具体类可改变系统的行为,因此对于可变的部分,系统设计对扩展是开放的。
开放-封闭原则是面向对象设计的核心所在。但要注意开发人员应该只对程序中频繁变化的那些部分作出抽象,拒绝不成熟的抽象和抽象本身一样重要。
2. 单一职责原则(SRP)
对于一个类而言,应该仅有一个引起它变换的原因。
举例:
class IPhone {
public:
void dial(string pno);
void hangup();
void send(char c);
char recv();
}
IPhone类具有两个职责,连接管理和数据通信。
对于变化的封装,应该遵循以下原则:
- 一个合理的类,应该仅有一个引起它变化的原因,即单一职责;
- 在没有变化征兆的情况下应用SRP或其他原则是不明智的;
- 在需求实际发生变化时就应该应用SRP等原则来重构代码;
- 如果测试不能迫使职责分离,僵化性和脆弱性的问题会变得很强烈,那就应该用Facade或Proxy模式对代码重构。
3. 里氏代换原则(LSP)
所有引用基类的地方都能透明的使用其子类的对象。
继承必须确保超类所拥有的性质在子类中仍然成立。”也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。
LSP的本质:在同一个继承体系中的对象应该有共同的行为特征。
注:如果子类不能完整的实现父类的方法或者父类的某些方法在子类中已经发生“畸变”则最好断开父子继承关系,采用依赖、聚集、组合等关系来取代继承。
4. 依赖倒置原则(DIP)
高层模块不应该依赖于低层模块,二者都应该依赖于抽象,抽象不应该依赖细节,细节应该依赖于抽象。(面向接口编程)
- 高层模块只应该包含重要的业务模型和策略选择,低层模块则是不同业务和策略实现。
- 高层模块和低层模块都要抽象出来。
- 高层抽象不依赖于高层和低层模块的具体实现,最多只依赖于低层的抽象。
- 低层的抽象和实现也只依赖于高层的抽象
- 任何变量都不应该持有一个指向具体类的引用。
- 任何类都不应该从具体类派生。
- 任何方法都不应该覆盖它的任何基类中已经实现了的方法。
5. 迪米特法则(最少知识原则LKP)
如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
根本思想是强调类之间的松散耦合。