实例分析根据真实情况具体补充,持续更新
- 参考主要博文如下:
https://www.cnblogs.com/dolphin0520/p/3919839.html
https://www.cnblogs.com/DreamDrive/p/4632370.html
https://blog.csdn.net/qwezhaohaihong/article/details/78471673
https://blog.csdn.net/hfreeman2008/article/details/52344343
https://blog.csdn.net/hfreeman2008/article/details/52289571
https://blog.csdn.net/hfreeman2008/article/details/52304172
文章目录
单一职责原则
定义
- 单一职责原则(Single Responsibility principle):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
意义
单一职责原则是实现高内聚、低耦合的指导方针
理解
一个类只负责一个职责或者一组总是同时由于相同原因变化的职责。将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中。
优点
- 降低类的复杂度
- 提高类的可读性
- 变更类的具体实现功能时更明确
开闭原则
定义
开闭原则(Open-Closed Principle):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
关键点
抽象化
理解
当对某个功能进行扩展时,尽量不改动已经存在的代码,只添加新的代码来实现功能的扩展。
优点
使系统拥有较好的适应性、灵活性、稳定性和延续性
降低代码的维护难度
里氏替换原则
定义
里氏代换原则(Liskov Substitution Principle, LSP):
定义一:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
定义二:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
名字缘由
这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。
意义
是实现开闭原则的重要方式之一、是继承复用的基石
理解
在程序中,将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常。
子类必须实现父类的全部方法。
子类覆盖或实现父类方法时,方法的前置条件(方法的形参)更宽松。(保证父类可以执行的参数子类也可以执行)
子类覆盖或实现父类方法时,方法的后置条件(方法的返回值)更严格。(保证能接受父类返回值的对象也能接受子类的返回值)
依赖倒置原则
定义
依赖倒转原则(Dependency Inversion Principle, DIP):高层模块不应该依赖低层模块,两者都应该依赖抽象。抽象不应该依赖于细节,细节应当依赖于抽象。
Java解读:
模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
接口或抽象类不依赖实现类
实现类依赖接口或抽象类
好处
减少类之间的耦合度。
理解
简言之,面向借口编程
在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。
实现依赖倒转原则时,我们需要针对抽象层编程,将具体类的对象通过依赖注入(DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入(Setter注入)和接口注入。
依赖注入三种方式解读
interface Interfac{
}
class InterfacImpl1 implements Interfac{
}
class InterfacImpl2 implements Interfac{
}
构造注入
class Handle {
private Interfac interfac;
public Handle(Interfac interfac) {
this.interfac = interfac;
}
}
setter注入
class Handle {
private Interfac interfac;
public void setInterfac(Interfac interfac) {
this.interfac = interfac;
}
}
接口注入
interface Handle{
void use(Interfac interfac);
}
分析
开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段
每个类尽量都有接口或者抽象类,或者抽象类和接口两都具备
变量的表面类型尽量是接口或者抽象类
任何类都不应该从具体类派生
尽量不要覆写基类的方法
接口隔离原则
定义
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
理解
借口隔离原则是对接口进行规范约束
接口的规范约束
接口要尽量小,不要出现臃肿的接口,但是小也是有限度的,不能违背单一职责原则。
接口要高内聚,提高接口,类,模块的处理能力,减少对外的交互。具体到接口隔离原则就是要求在接口中尽量减少公布public方法,接口是对外的承诺,承诺越少对系统开发越有利,变更的风险就越少。
接口设计是有限度的,接口的设计粒度越小,系统越灵活。
一个接口只服务于一个子模块或业务逻辑
迪米特法则
定义
一个软件实体应当尽可能少地与其他实体发生相互作用。
优点
减少对象间的耦合性
理解
通过引入一个合理的第三者来降低现有对象之间的耦合度。
在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;
在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;
在类的设计上,只要有可能,一个类型应当设计成不变类;