开闭原则
开闭原则(Open-Closed Principle,OCP)是指一个软件实体应该对扩展开放,对修改关闭。所谓的开闭,其实是对修改和扩展两个行为的一个原则。它强调的是用抽象对象构建框架,用实现扩展细节。
示例
开闭原则其实在大话设计模式中说得非常好,让人通俗易懂。它举了一个例子,是加减乘除法的例子:
开始需求是做一个加法的操作。后来继续加入减法、乘法、除法。
开始我们想加法以后可能会做一个需求变更:加入其它的算法法则。所以我们要有一个预判性,这个预判性会导致我们项目以后的扩展性,也会导致如果需求发生变更,程序修改的难易程度。
所以,我们要做一个算法法则的操作类,加减乘除法都继承此操作接口。再加一个算法法则的客户端类类操作此算法。
依赖倒置原则
依赖倒置原则(Dependence-Inversion Principle,DIP)是指设计代码结构时,高层模块不应当依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖具体细节(实现),细节应该依赖抽象(接口)。
单一职责原则
单一职责原则(Simple Responsibility Principle ,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个类负责两个职责,一旦发生变更,修改其中一个职责的逻辑代码,有可能导致另一个职责的功能发生故障。总体来说,就是一个类、接口或方法只干一件事儿。
接口隔离原则
接口隔离原则是指用多个专门的接口,而不是单一的总接口。客户端不应该依赖它所不需要的接口。这个原则指导我们在接口设计时要考虑一下几点:
- 一个类对另一个类的依赖应该建立于最小的接口之上。
- 建立单一接口,不要建立庞大臃肿的接口之上。
- 尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。
迪米特原则
迪米特原则是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则。迪米特原则强调:只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以是朋友,而出现在方法体中的类不属于朋友。
里氏替换原则
历史替换原则是指如果对每一类型为T1的对象O1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1替换为O2时,程序P的行为没有发生改变,那么类型T2是类型T1的子类型。引申含义是:子类可以扩展父类的功能,但不能够修改父类的功能。
合成复用原则
合成服用原则是指尽量使用对象组合/聚合而不是继承关系来达到软件复用的目的。