面对对象设计原则
目录
单一职责原则
一个对象只包含单一的领域职责,并被完整地封装在类中。
- 会增加类的数量
- 提供复用性
- 提高可维护性
开闭原则
一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
里氏代换原则
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
- 尽量把父类设计为抽象类或者接口
- 子类的所有方法必须在父类中声明
依赖倒转原则
面向接口编程,不要争对实现编程。
依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。一个具体类应当只实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。
简述:引入抽象层,在抽象层编程,具体类写进配置,避免直接使用实际对象。
优点:
-
系统灵活性
-
满足开闭原则,拓展时只需拓展抽象层和配置文件,避免了修改源码
-
类耦合
- 零耦合:两个类之间没有关系
- 具体耦合:具体实例间的直接引用
- 抽象耦合:抽象类之间或者抽象类与具体类之间的引用
-
依赖注入:定义时是抽象的
- 构造注入:通过构造函数传入
- 设值注入:setter方法传入
- 接口注入:在接口中声明的业务方法来传入具体类的对象。
在大多数情况下,这三个设计原则会同时出现,开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。
接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
即按领域或功能拆分开作为分接口,不要堆在一起作为一个总的接口。
使用接口隔离原则时,在满足单一职责原则的前提下,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。
合成复用原则
又称组合/聚合复用原则,尽量使用对象组合,而不是继承来达到复用的目的。
- 继承复用:子类继承父类实现拓展,又称白盒复用(因为对子类暴露了超类的实现细节)
- 耦合度高
- 破坏了系统的封装性,父类变了,子类也受影响
- 是静态的,灵活性不足
- 使用环境有限,如java类不能final
- 组合复用:将一个类对象作为另一个类对象的成员变量(定义时抽象(最好)),以委托的形式去调用成员变量方法,又称黑盒复用
- 耦合度低
- 成员变量变化对该类影响小
- 可以在运行时动态引用与其成员变量类型相同的其它对象实例
在系统设计时,尽可能使用组合/聚合复用;在使用继承复用时,需要严格遵守里氏代换原则,适当使用继承可以一定程度上降低系统复杂性,但请慎用。
迪米特法则
一个软件实体应当尽可能少地与其他实体发生相互作用。
迪米特法则旨在降低系统的耦合度,使类与类之间保持松散的耦合关系。