单一职责原则
单一职责的定义为:应该有且仅有一个可以引起类的变更,也就是一个职责一个接口(业务逻辑的划分);
好处:
- 类的复杂性降低;
- 可读性提高;
- 可维护性提高;
- 变更引起的风险降低;一个接口修改只对相应的实现类有影响,对其他接口没有影响
里氏替换原则
通俗地说,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常;但反过来就不行,有子类出现的地方,父类未必就能适应;(因此在类中调用其他类时,就务必使用父类或接口,如果不能这样做,则说明类的设计已经违背了LSP原则了)
如果子类不能完整地实现实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖,聚集,组合等关系代替继承;
方法中的输入参数称为前置条件
,并且子类中的方法的前置条件必须与父类中被覆写的方法的前置条件相同或者更宽松;(父类出现的地方,子类就可以出现)
依赖倒置原则
最直接的理解就是:面向接口编程
,抽象定义:
- 高层模块不应该依赖于低层模块,两者都应该依赖其抽象;
- 抽象不应该依赖细节;
- 细节应该依赖抽象;
在Java语言中的表现为:
- 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
- 接口或抽象类不依赖于实现类;
- 实现类依赖接口或抽象类;
接口隔离原则
接口的种类:
- 实例接口,如我们在Java中声明一个类,然后用new 关键字来产生一个实例,它是对一个类型的事物的供述,这是一个接口;
- 类接口,在Java中使用关键字
interface
定义的接口;
定义:说白了就是接口尽量细化,同时接口中的方法尽量少
迪米特法则
也叫最少知识原则,简单说应该对其他对象有最少的了解,也就是说一个类应该对自己需要耦合或调用的类知道得最少;也就是类间解耦,弱耦合
开闭原则
定义:软件实体应该对扩展开放,对修改关闭,也就是说软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化;
如何应用到实际编程中?:
- 抽象约束,也就是通过接口或抽象类约束实现扩展,对扩展进行边界的限定,不允许出现在接口或抽象类中不存在的public 方法;并且参数的类型、引用对象尽量使用接口或者抽象类,最后就是抽象层尽量保持稳定,一旦确定就不允许修改;
- 元数据控制模块行为,也就是说用元数据来控制程序的行为,减少重复开发。元数据就是用来描述环境和数据的数据,也就是我们常说的配置参数;
- 制定项目章程,让团队的所有成员都遵守约定;
- 封装变化,将相同的变化封装到一个接口或抽象类中,不同的变化封装到不同的接口或变化;