1、单一职责原则
定义:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。(就一个类而言,应该仅有一个引起它变化的原因)
解释:在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,相当于将这些职责耦合在一起,当其中一个职责变化时可能会影响其它职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可以将它们封装在同一个类中。单一职责原则是实现高内聚,低耦合的指导方针。
2、开闭原则
定义:软件实体应当对外扩展开放,对修改关闭
解释:在开闭原则的定义中,软件实体可以指一个软件模块,一个由多个类组成的局部结构或一个独立的类。开闭原则就是指软件实体应尽量在不修改原有代码的情况下进行扩展。为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。
3、里氏代换原则
定义:所有引用基类的地方必须能透明地使用其子类的对象
解释:里氏替换原则表明,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象,那么它不一定能使用基类对象。
举例:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢所有动物(基类推子类成立,子类推基类不一定成立)
里氏替换原则是实现开闭原则的重要方式之一,由于在使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时在确定其子类类型,用子类对象来替换父类对象。在运用里氏代换原则时应该将父类设计为抽象类或接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,在运行时子类实例替换父类实例,可以很方便地扩展系统的功能,无需修改原有子类的代码,增加新的功能可以增加一个新的子类来实现
4、依赖倒转原则
定义:高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖细节,细节应该依赖于抽象
解释:简单来说,依赖倒转原则要求针对接口编程,不要针对实现编程。依赖倒转原则要求在程序代码中传递参数时或在关联关系中尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。为了确保该原则的应用,一个具体类应该只实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加新的方法。
在实现依赖倒转原则时需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时采用抽象的形式来注入所依赖的对象。通常的注入方式有3中:
(1)构造注入:通过构造函数来传入具体类的对象
(2)设值注入(setter注入):通过setter方法来传入具体类的对象
(3)接口注入:通过在接口中声明业务方法来传入具体类的对象
这些方法在定义时使用的是抽象类型,在运行时在传入具体类型的对象,由子类对象来覆盖父类对象
5、接口隔离原则
定义:客户端不应该依赖那些它不需要的接口
解释:根据接口隔离原则,当一个接口太大时需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。这里的“接口”往往有两种不同的含义:
(1)一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象。这时候可以把接口理解成角色,一个接口只能代表一个角色,每个角色都有它特定的一个接口,此时这个原则可以叫做“角色隔离原则”
(2)某种语言具体的“接口”,有严格的定义和结构,比如Java和C#中的interface。接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,应该为客户端提供尽可能小的单独的接口,而不要提供大的总接口。
6、合成复用原则
定义:优先使用对象组合,而不是通过继承来达到复用的目的
解释:合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用功能的目的。简而言之,在复用时要尽量使用组合/聚合关系(关联关系),少用继承
7、迪米特法则
定义:每一个软件单位对其他单位只有最少的知识,而且局限于那些与本单位密切相关的软件单位
解释:迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用。如果一个系统符合迪米特法则,那么当其中一个模块发生修改时就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的现在,迪米特法则要求限制软件实体之间通信的宽度和深度。应用迪米特法则可以降低系统的耦合度,使类与类之间保持松散的耦合关系
迪米特法则还有几种定义形式,包括不要和“陌生人”说话、只与你的直接朋友通信等。在迪米特法则中,对于一个对象,其朋友包括以下几类:
(1)当前对象本身(this)
(2)以参数形式传入到当前对象方法中的对象
(3)当前对象的成员对象
(4)如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友
(5)当前对象所创建的对象
简而言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度
来源:https://www.cnblogs.com/remote/p/10687851.html