转载于 https://blog.csdn.net/geekun/article/details/51325520
摘要:
这6(7)个设计原则非常重要,在我们以后写project的时候注意思考应该用到哪儿些原则,是否违背了原则。设计思想是我们在设计程序的时候应该考虑到的。
阐述
单一职责适用于接口、类、方法。顾名思义,就是要求一个接口或类只有一个职责,它就负责一件事情。
好处
类的复杂性降低,有清晰明确的定义
提高了可读性和可维护性
使得变更引起的风险降低
注意
职责没有一个量化的标准,并且受非常多因素的制约,现实中实现起来会有困难。
定义2
所有引用基类的地方必须能透明地使用其子类的对象。
阐述
通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。
里氏替换原则的4层含义
子类必须完全实现父类的方法
子类可以有自己的个性
覆盖或实现父类的方法时输入参数可以被放大
覆写或实现父类的方法时输出结果可以被缩小
3. 依赖倒置原则
定义
依赖倒置原则(Dependence Inversion Principle,DIP),包含三层含义:
高层模块不应该依赖低层模块,两者都应该依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
在Java语言中的表现
模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
接口或抽象类不依赖于实现类;
实现类依赖接口或抽象类。
好处
采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
实践方法
每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备
变量的表面类型尽量是接口或者是抽象类(有些不必,如xxxUtil类等)
任何类都不应该从具体类派生,尽量不要覆写基类的方法
结合里氏替换原则
接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化。
在项目中,大家只要记住是“面向接口编程”就基本上抓住了依赖倒置原则的核心。
结构隔离原则的4层原则
接口要尽量小
接口要高内聚
定制服务(单独为一个个体提供优良的服务)
接口设计是有限度的(灵活设计接口粒度大小)
5. 迪米特法则
定义
迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP):一个对象应该对其他对象有最少的了解。
阐述
通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。
迪米特法则的几层含义
只和朋友交流(出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友)
朋友间也是有距离的
是自己的就是自己的(如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,就放置在本类中)
6. 开闭原则
定义
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
阐述
开闭原则告诉我们应尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。
重要性
开闭原则是最基础的一个原则。有以下好处:
方便测试
提高复用性
提高可维护性
符合面向对象开发技术
实现方法
抽象约束
通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法
参数类型、引用对象尽量使用接口或者抽象类,而不是实现类
抽象层尽量保持稳定,一旦确定即不允许修改
尽量用配置参数控制程序的行为(如spring和strust的配置文件)
总结
六个原则如下:
Single Responsibility Principle:单一职责原则
Open Closed Principle:开闭原则
Liskov Substitution Principle:里氏替换原则
Law of Demeter:迪米特法则
Interface Segregation Principle:接口隔离原则
Dependence Inversion Principle:依赖倒置原则
把这6个原则的首字母(里氏替换原则和迪米特法则的首字母重复,只取一个)联合起来就是SOLID(solid,稳定的),其代表的含义也就是把这6个原则结合使用的好处:建立稳定、灵活、健壮的设计,而开闭原则又是重中之重,是最基础的原则,是其他5大原则的精神领袖。
遵循这6大设计原则基本上可以应对大多数变化,适当时候可以进行扩充,但是也并不局限于这6大设计原则。