在面向对象编程中,所有的原则或设计模式的目的是:高聚合、低耦合、易扩展、易维护、高复用。
1、单一职责原则:类的职责功能要单一,不要一个类包含过多的实现方法,要保证能改变这个类的原因来源只有一个。
比如,一个类里包含三种方法,数据库连接、数据增查删改、图表绘制和更新,应当改进为三个单独的类分别实现这三个方法。
2.接口隔离原则:类似于单一职责原则,要求一个接口不要包含过多的方法,可以将每个接口实现单独的接口功能。
和单一职责的区别,个人理解一个是类的层面,一个是接口的层面
3.开闭原则:一个软件实体(可以是类、模块、方法等)对扩展开发(可以扩展),对修改关闭(不可以修改)。
4.里氏转换原则:所有能接受父类对象类型的引用,也必须能透明地使用其子类;可以将这个理解成是一条定律或规范。
一般的运用场景是,将父类设为抽象类或接口,由子类实现具体的方法,引用父类作为参数类型,运行时再引用具体的子类实例,这样可以实现开闭原则,即不改变源代码,通过这个原则来进行扩展或维护。
5.依赖倒置原则:这是一种手段(方法/措施),即抽象不可依赖细节,细节需要依赖抽象(抽象是爷)
即用层次高的抽象类或接口作为类型来声明数据类型、参数类型、返回值类型等,而不是用具体的类来作为作为数据类型。
依赖倒置的三种用法(俗称依赖注入):1.通过构造函数、2.通过方法引用(抽象类或接口作为参数)、3.接口注入。
小结3/4/5:开闭原则是目标,要实现这个目标需要依靠里氏原则这个规范(指导思想:父类可以被引用,那么子类必定可以被引用)去执行,执行的手段就是依赖倒置原则(方法是将抽象类或接口作为数据类型,用其具体的子类去实例化进行具体的引用)。
6.合成复用原则:尽量使用对象组合方式实现引用,尽量不要用继承。
因为继承会破坏闭合原则,将父类的实现细节暴露,如果滥用继承会导致程序冗余、维护复杂,比如A类中引用B类方法B1实现mysql的连接方法,现在需要增加Oracle数据库(C类方法C1)连接;这种情况不要用用A继承B和A继承C,用合成复用的原则,尽量使用对象组合,可以改为B为抽象类,C为B的子类,在A中实例化引用C.C1,即可实现A和C的对象组合。
7.迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用。
应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。
迪米特法则还有几种定义形式,包括:不要和“陌生人”说话、只与你的直接朋友通信等,在迪米特法则中,对于一个对象,其朋友包括以下几类:
(1) 当前对象本身(this);
(2) 以参数形式传入到当前对象方法中的对象;
(3) 当前对象的成员对象;
(4) 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
(5) 当前对象所创建的对象。