0.概述
面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,他们是从许多设计方案中总结出来的指导性原则
1.单一原则
一个类只负责一个功能领域中的相应职责,或者说:就一个类而言,应该只有一个引起它变化的原因。
个人总结:将不同职责的方法放在不同的类中。
2.开闭原则
软件实体对应扩展开放,而对修改关闭,或者说:软件实体应尽量在不修改原有代码的情况下进行扩展,抽象化是开闭原则的关键。
个人总结:针对相似的功能另外新建一个抽象类,相似功能共同继承此抽象类,以后再有相似功能加入时可以继承此抽象类,在调用方法时中使用上转型对象处理即可。
3.里氏代换原则
所有引用父类对象的地方能够透明地使用其子类的对象。(注意:使用此方法时子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法,因此尽量把父类设计为抽象类或者接口)
个人总结:在程序中尽量使用父类类型定义对象,在运行时再确定子类类型,使用上转型对象描述。
4.依赖倒转原则
抽象不应该依赖于细节,细节应该依赖于抽象,或者说:要针对接口编程,而不是针对实现编程。
关键名词:依赖注入:当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象,常用的注入方式有三种:构造注入,设值注入和接口注入。
个人总结:在具体的实现类和调用具体类方法之间引入抽象层。几乎所有具体的实现类中包含的方法都要在接口或抽象类中定义。
5.接口隔离原则
使用多个专门的接口,而不是用单一的总接口,或者说,客户端不应该依赖那些它不需要的接口,每个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。
关键名词:接口:这里的“接口”往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言具体的“接口”定义,有严格的定义和结构,比如Java语言中的interface。
个人总结:简而言之就是把功能细化,但在细化过程中又不能太细否则会导致接口过多,如果单凭感觉来分也许分法也不尽相同。
6.合成复用原则
尽量使用对象组合,而不是继承来达到复用的目的。
个人总结:实现复用时应该多用关联(创建新的关系类,将需要连接的类的方法写入),少用继承。
7.迪米特法则
一个软件实体应当尽可能少的与其他实体发生相互作用,对于一个对象只能直接与朋友发生交互,其朋友包含以下几类:
(1)当前对象本身;
(2)以参数形式传入到当前对象方法中的对象;
(3)当前对象的成员对象(如果成员对象使一个集合,那么集合中的元素也都是朋友);
(4)当前对象所创建的对象。
个人总结:主要目的是为了降低系统的耦合度,使类与类之间保持松散的耦合关系,在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。。