内容总览
- 单一职责原则
- 里氏替换原则
- 依赖倒置原则
- 接口隔离原则
- 迪米特法则
- 开闭原则
单一职责原则
单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式与实践》一书中给出的。马丁表示此原则是基于汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的内聚性原则发展出的。 [1]
所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
文本来源:单一职责原则
在我们常见的互联网设计中,单一原则使用就是DDD领域驱动设计模式,但是这个也有优缺点:
优点
- 类职责明确,复杂度降低
- 可读性提高,可维护性提高
- 功能单一性,耦合度低,变更复杂度降低
缺点
- 由于单一职责原则,单一性的抽象面临着难点,实现单一职责考虑的方面就很多,考虑不周到会给系统带来严重后果,过细划分原则或者过粗划分原则都给系统带来复杂度。这就会有DDD领域驱动原则,原子原则再一层扩展业务原则,动态组装原则,但是一处牵动全局,维护的单一职责的业务时,可能要过多考虑原则职称关联性,所以这里的DDD也会面临拆分的颗粒度问题。
实例样板
@Mapper
public interface UserMapper {
// 添加用户信息
int insertUser(User user);
// 通过用户id删除用户
int deleteUserById(int uId);
// 通过用户id查询用户id
User selectUserById(int uId);
}
上面mybatis操作数据库,也就是类中,每个方法都有独立的功能,独立的职责,当然,可以抽象出一个类就一个功能,也就是把上面的三个功能点抽象出三个接口。
里氏替换原则
在面向对象的程序设计中,里氏替换原则(Liskov Substitution principle)是对子类型的特别定义。它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为“数据的抽象与层次”的演说中首先提出。
文章来源:里氏替换原则
其实说白了就是子类和父类的关系,子类继承基类,但是不能修改父类原有功能。java继承变成语言时,我们尽量不要修改父类属性和关系,除非特殊情况,虽然多态有时违背了此原则,但是尽量少违背。
java中涉及里氏替换原则的有
- 类与类之间的修饰符,子类修饰符必须大于等于父类
- 策略模式
- 代理模式
- 合成模板模式
依赖倒置原则
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
文本来源:依赖倒置原则
java中涉及依赖倒置原则是:
- 实现类以来接口和抽象,接口和抽象不依赖于实现类,降低耦合,提高稳定
- 在spring的IOC使用此原则
接口隔离原则
java里面就是面向接口编程
迪米特法则
迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。
文本来源:迪米特法则
- 最小执行权,在安全权限设计方面,就设计这个法则。
- 还有我们在设计层面,明确入参和出参数,其他一概不想知道内部情况,也就是我们接口设计原则
开闭原则
在面向对象编程领域中,开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查,单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。
文本来源:开闭原则
其目的是实现高内聚,低耦合,可扩展,这个原则需要前面原则一些基础作为铺垫。
使用实际场景
- java使用修饰符,严格修改访问范围,进行强制约束,操作扩展边界
- 抽象层或者接口层,确定范围,一旦确定就不可修改,只能扩展。
设计模式
这里提及一下常见的设计模式
- 单例模式
- 工厂模式
- 观察者模式
- 代理模式
- 策略模式
- 适配器模式
- 模板方法模式
适配器和策略区别:一个是适配执行代码(if,target-adapter-adaptee),一个是选择一个策略(key-value,返回策略实现类,Strategy->StrategyFactory->execute())。
参考文献
【1】百度百科
【2】JAVA重要知识点梳理