面试题答案
一键面试用户创建功能
- 接口:
- 定义
UserCreationService
接口,包含createUser(User user)
方法。这样遵循单一职责原则(SRP),该接口只负责用户创建相关功能。 - 同时遵循依赖倒置原则(DIP),高层模块(如应用服务层)依赖此抽象接口,而非具体实现类。
- 定义
- 实现类:
- 创建
UserCreationServiceImpl
类实现UserCreationService
接口。此实现类专注于实现用户创建逻辑,符合单一职责原则。
- 创建
用户查询功能
- 接口:
- 定义
UserQueryService
接口,包含findUserById(int id)
、findUsersByCriteria(Criteria criteria)
等方法。同样遵循单一职责原则,只负责用户查询相关操作。并且依赖倒置原则,让高层模块依赖此抽象接口。
- 定义
- 实现类:
- 创建
UserQueryServiceImpl
类实现UserQueryService
接口,将查询逻辑封装在此类中,符合单一职责原则。
- 创建
用户更新功能
- 接口:
- 定义
UserUpdateService
接口,包含updateUser(User user)
方法。遵循单一职责原则,专注于用户更新功能。依赖倒置原则,使得高层模块依赖抽象而非具体实现。
- 定义
- 实现类:
- 创建
UserUpdateServiceImpl
类实现UserUpdateService
接口,将用户更新逻辑放在此类,符合单一职责原则。
- 创建
整体架构遵循的SOLID原则要点
- 单一职责原则(SRP):每个功能(创建、查询、更新)都有其对应的接口和实现类,每个类只负责单一的、明确的功能,降低了类的复杂度和维护成本。
- 依赖倒置原则(DIP):高层模块(如应用层的业务逻辑)依赖于上述定义的接口,而不是具体的实现类。这样当实现类发生变化时(如更换数据库查询方式),高层模块无需修改,提高了系统的可维护性和可扩展性。
- 开闭原则(OCP):通过接口和抽象类,模块对扩展开放(如增加新的查询方法或更新逻辑),对修改关闭(已有的接口和实现类不需要修改)。新功能可以通过实现已有接口或扩展抽象类来添加。
- 里氏替换原则(LSP):任何使用
UserCreationService
、UserQueryService
、UserUpdateService
接口的地方,都可以透明地使用其具体实现类UserCreationServiceImpl
、UserQueryServiceImpl
、UserUpdateServiceImpl
,确保了继承体系的正确性和可靠性。 - 接口隔离原则(ISP):每个功能都有自己独立的接口,避免了一个大而全的接口,客户端(高层模块)只依赖于它们需要的特定接口方法,降低了接口的复杂度和不必要的依赖。