1、开闭原则(Open Close Principle)
定义:开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。
分析:抽象化是开闭原则的关键。想要达到这样的效果,我们需要使用接口和抽象类。
2、里氏代换原则(Liskov Substitution Principle)
定义:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
分析:我的理解就是引用了父类的地方替换成子类不影响代码运行
使用里氏代换原则需要注意:
1)子类的多有方法必须在父类中声明,或者子类必须实现父类中声名的所有方法。
2)尽量把父类设计成抽象类或接口,让子类继承父类或实现父接口。增加一个新功能时,通过增加一个新的子类来实现。
3)java语言编译时会检查一个程序是否符合里氏代换原则,但只是一个语法意义上的检查,有局限性。
3、依赖倒转原则(Dependence Inversion Principle)
定义:这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
分析:简单来说,依赖倒转原则就是指:代码要依赖于抽象的类,而不要依赖于具体的类;要针对接口或抽象类编程,而不是针对具体类编程。
实现开闭原则的关键是抽象化,并且从抽象化导出具体化实现,如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。
Spring的DI 就是依赖倒转原则的一个具体实现
策略模式也遵循依赖倒转原则
4、接口隔离原则(Interface Segregation Principle)
定义:客户端不应该依赖那些它不需要的接口。
一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
分析:接口隔离原则针对的是接口类,与单一职责原则的区别就是单一原则针对的是实现类,两者区分的维度不一样
5、迪米特法则,又称最少知道原则(Demeter Principle)
定义:
-
不要和“陌生人”说话。
-
只与你的直接朋友通信。
-
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
分析:也是为了降低类之间的耦合,增加局部的内聚,增强扩展性。当一个模块功能独立时,对其进行修改扩展会更加的容易
在迪米特法则中,对于一个对象,其朋友包括以下几类:
-
当前对象本身(this);
-
以参数形式传入到当前对象方法中的对象;
-
当前对象的成员对象;
-
如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
-
当前对象所创建的对象。
任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。
迪米特法则可分为狭义法则和广义法则。在狭义的迪米特法则中,如果两个类之间不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
狭义的迪米特法则:可以降低类之间的耦合,但是会在系统中增加大量的小方法并散落在系统的各个角落,它可以使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联,但是也会造成系统的不同模块之间的通信效率降低,使得系统的不同模块之间不容易协调。
广义的迪米特法则:指对对象之间的信息流量、流向以及信息的影响的控制,主要是对信息隐藏的控制。信息的隐藏可以使各个子系统之间脱耦,从而允许它们独立地被开发、优化、使用和修改,同时可以促进软件的复用,由于每一个模块都不依赖于其他模块而存在,因此每一个模块都可以独立地在其他的地方使用。一个系统的规模越大,信息的隐藏就越重要,而信息隐藏的重要性也就越明显。
用途在于控制信息的过载:
1)在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;
2)在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;
3)在类的设计上,只要有可能,一个类型应当设计成不变类;
4)在对其他类的引用上,一个对象对其他对象的引用应当降到最低。
6、合成复用原则(Composite Reuse Principle)
定义:合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
分析:继承属于高耦合,没有组合/聚合方式灵活。使用继承时需要充分遵循里氏替换原则.
总之就是能用组合/聚合就不用继承
7、单一职责原则(Single Responsibility Principle, SRP)
定义:类的职责要单一,不能将太多的职责放在一个类中
分析:一个类职责越多,被复用的可能性越小,粒度越小越可能被复用。单一原则是针对实现类的设计模式