前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java为什么每一层都要定义接口和Impl?只是为了好看?

Java为什么每一层都要定义接口和Impl?只是为了好看?

作者头像
Louis XIV
发布于 2025-04-04 11:26:19
发布于 2025-04-04 11:26:19
7000
代码可运行
举报
文章被收录于专栏:支付进阶之路支付进阶之路
运行总次数:0
代码可运行

大家好我是Louis,有多年一线大厂的架构设计和DDD实战经验。今天来聊一个话题:Java是不是每一层都要定义接口和实现类?

这确实是Java饱受诟病的一个点,也没有谁说一定要这么干,但事实上大家就是这么干了,导致代码看起来特别“啰嗦”,哪怕就1个实现类,也非得加上接口定义。我跟几位资深开发探讨这个话题,他们也说不上来为什么,总之大家都这么干,我不想成为异类

今天我想把这个问题掰扯清楚,每一个这样的小问题背后,都是对架构设计的深度思考。也欢迎大家在评论区交流。

“面向接口”编程的发展历程

这个问题的开端,还得追溯到最开始的“面向接口编程”。

面向接口编程由来已久,最初是1994年4位编程界大佬(合称GoF)在《Design Patterns》一书中提出Program to an interface, not an implementation.其中有诸多的模式把接口与实现进行分离,这是大佬们首次向大家展示面向接口编程的价值。

Java语言的贡献。1995年Java首个版本发布就把interface作为了关键字,这是首次在语言层面对接口这个概念有了直接的支持。结合上面的《Design Patterns》一书,程序员们也很快开始应用设计模式,接口在编程界大放异彩。

Spring的推波助澜。Spring在业界的地位毋庸置疑,特别是在2009年Spring3.0发布后,已经成为了Java后端开发的事实标准。但也是在这一阶段画风慢慢发生了改变,Spring虽没提供规范,但提供了@Controller、@Service等几个注解,程序员逐渐也把代码分为了Controller、Service、Dao这几层,并且每个Service和Dao都会加上接口定义。

更加丧心病狂的是,大约2015年左右,随着微服务的爆火,DDD的设计思想逐渐被接纳,一部分经历过传统三层架构的程序员开始向DDD靠拢,咱知道DDD没别的就是分层多。于是我遇见了前所未有的神奇代码,就是在AppService、DomainService、Factory、Repository、Dao、Converter...所有能想到的都加上了接口!真真正正实现了“面向接口”编程。

由此可见有一大部分人其实是缺少独立思考能力的,只是跟着教条主义,依葫芦画瓢。

定义接口的作用

接口的作用其实在上面提到的《Design Patterns》中已经有详细说明了,但23种设计模式,并不是每一种都那么常用。

这里我只给大家总结一下在实际项目中更加常见的接口的使用方式:

1. 做为一种行为契约

特别是在跨系统交互上,A系统调用B系统,只需要B系统提供接口即可。这样在定义完接口以后就可以独立开发,还可以对接口进行Mock测试。分别自测完再进行集成。

在系统内,不同模块之间需要用接口做契约吗?我认为视情况而定,但大多数情况下不需要。例如C模块需要调用D模块的能力,完全可以先定义一个空方法,大家想一想,这里Model D一定要用interface吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ModelC {
private ModelD d;

public void f() {
    // ...
    d.doSomething(10);
    // ...
  }
}

publicclass ModelD {
public void doSomething(int a) {
    // TODO 暂未实现
  }
}

2. 调用方只关注接口,不关注实现

这句话的隐含意思是:实现是可以被替换的。例如定义了一个ID生成器接口

最开始由于业务量小、单机部署,可以直接在内存中生成ID;后来业务量上来了需要改为分布式ID生成器,而且在不同场景下可能会用到基于Redis的实现和基于MySQL的实现。

这时我们就可以实现多个不同的生成器,可以根据不同的业务场景采用不同的实现。但是在调用方无需感知多种不同实现的差异性。

3. 用作控制反转

控制反转(IoC)是衡量高阶程序员的一把尺子,我见过许多行云流水的代码,几乎都离不开控制反转的影子。

这其中最典型的例子,就是DDD里面的Repository模式。在传统三层架构中,Service层需要访问数据库,是通过依赖Dao,感知数据的存储方式和实现细节来实现的。然而在DDD中,领域模型才是一等公民,通过建立Repository层实现了控制反转,具体的数据库实现要依赖Repository接口。同样,下图中的缓存访问也是这个道理。

在我的DDD包子铺项目中也是大量用到控制反转来优化代码结构,后续我会专门拿出一些例子来讲解。

哪些层真的需要定义接口?

所以,文章开头的那个问题,答案当然是否定的。我们不要一味地追求所谓“代码整齐”,没有实际意义。解决可用性、健壮性、可维护性、兼容性...这些才是关键。

需要定义接口的层

  • AppService层,这一层由于是业务的边界,我个人习惯用Facade Pattern,定义Facade接口,再由AppService层去实现。同时Facade接口也作为对外的接口契约
  • Repository层、缓存/消息/邮件等基础设施,也都建议加上接口定义,这么做是为了进行控制反转
  • ACL层(防腐层),用的是Proxy Pattern,用于隔离上下游的变化

关于这些层分别是什么?不了解的同学可以看这篇文章:一张图看懂DDD+CQRS架构

Domain Service要不要定义接口

不建议。Domain Service是对内提供的轻量原子服务,其中的逻辑也都是对Entity、Repository、Event的编排,不大可能存在多个不同的实现,没有必要定义接口。

这里其实有一点点小争议,定义接口还有一个好处就是单元测试的时候方便Mock,这个我想专门放到讲Unit Test的时候说。我个人依然不建议定义Domain Service接口。

Factory要不要定义接口

Factory Pattern真要讲起来还挺复杂的,又细分为简单工厂、工厂方法、抽象工厂。大家可以自行去搜一搜这几者的差别,其中简单工厂、工厂方法不需要专门定义接口,而抽象工厂就需要定义接口以实现可扩展性。

但我觉得,我们的业务代码中,不适合把工厂设计得过于抽象,一般来说简单工厂就够用了

总结

虽然是小问题,但要琢磨透、讲明白也不容易。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 支付进阶之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
再遇vue之vue3新特性
首先说明一下,vue2和vue3是Vue.js的两个主要版本。目前vue3已经更新到3.3.4的版本了
用户6297767
2023/11/21
5470
再遇vue之vue3新特性
Vue学习笔记(一)
耕耘实录
2024/05/24
780
Vue学习笔记(一)
Vue 3.0 有哪些新特性值得我们提前了解
Vue.js 作者兼核心开发者尤雨溪宣布 Vue 3.0 进入 Beta 阶段。
Vam的金豆之路
2021/11/30
6910
Vue 3.0 有哪些新特性值得我们提前了解
掌握这些vue内容,让你在提升代码复用上不再纠结!
前端工程化的最终目的都是为了能够更好地维护代码。代码复用是提升效率和可维护性的利器。 vue 中针对不同场景和业务情况,提供了各种方式。全面了解这些内容,可以在开发过程中让你得心应手!
奋飛
2023/07/10
2760
掌握这些vue内容,让你在提升代码复用上不再纠结!
推荐:非常详细的vue3.0开发笔记(7k字)
当将当前的技术栈从Vue 2.0升级到Vue 3.0时,有许多值得考虑的理由。以下是10个升级到Vue 3.0的理由:
微芒不朽
2023/08/21
5190
推荐:非常详细的vue3.0开发笔记(7k字)
最全系列的vue3入门教程『图文并茂』
Vue 3 是一个流行的开源JavaScript框架,用于构建用户界面和单页面应用。它带来了许多新特性和改进,包括更好的性能、更小的打包大小、更好的TypeScript支持、全新的组合式 API,以及一些新的内置组件。
linwu
2023/07/27
5.1K0
最全系列的vue3入门教程『图文并茂』
探索 Vue 3 中的 ref:深入理解与实战应用
在前端开发的世界中,Vue.js 已经成为了许多开发者的首选框架。它以其简洁、灵活和高效而闻名,而 Vue 3 引入的新特性 ref 更是让这一切更加得心应手。本文将深入探讨 Vue 3 中的 ref,从基本概念到深层原理,以及实际应用中的各种技巧和注意事项。
繁依Fanyi
2024/06/29
8980
vue3知识点:自定义hook函数
答案:请看官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html
刘大猫
2024/10/31
1360
Vue3.0 beta版学习笔记
https://github.com/vuejs/vue-next
用户7572539
2020/08/26
7190
vue3知识点:readonly 与 shallowReadonly
<font color='red'>如果使用readonly包裹的person对象的所有属性数据</font>都只读不可需改,即name、age、salary都只读无法修改。
刘大猫
2024/10/31
920
Vue 3.0 源码分析-数据侦测
2020年前端大事件之一,Vue 3.0终于正式发布了。作为一个大的版本更新,Vue 3 与 Vue 2相比,实现原理,使用方式等均有着不小的改动。本文主要会介绍讲述二块内容,分别是Vue 3.0 的简要介绍,Vue 3.0 数据侦测源码分析。小伙伴们可以根据自己的需求,查看对应的内容,也欢迎各位一起探讨,一起学习。 Vue 3.0 简要介绍 Vue 3 的 “前世今生” 2016年,Vue 2.0 正式发布,时至今日,已经过去了四年的时光。诚然,在这四年中,Vue 2的社区建设一直呈现出一副蓬勃向上的态
QQ音乐前端团队
2021/01/11
7510
Vue3 对比Vue2,你找到哪些变化?
希望本篇文章能帮你加深对 Vue 的理解,能信誓旦旦地说自己熟练Vue2/3。除此之外,也希望路过的朋友可以帮助我查漏补缺🤞。 内容混杂用法 + 原理 + 使用小心得,建议收藏,慢慢看。 区别 生命周期的变化 整体来看,变化不大,只是名字大部分需要 + on,功能上类似。使用上 Vue3 组合式 API 需要先引入;Vue2 选项 API 则可直接调用,如下所示。 // vue3 <script setup> import { onMounted } from 'vue' onMounted(
@超人
2022/04/14
1.1K0
Vue3学习笔记
①性能的提升 打包大小减少41%、初次渲染快55%,更新渲染快133%,内存减少54%…… ②源码的升级
玖柒的小窝
2021/09/29
8700
Vue3学习笔记
Vue3 中有哪些值得深究的知识点?
众所周知,前端技术一直更新很快,这不 vue3 也问世这么久了,今天就来给大家分享下vue3中值得注意的知识点。喜欢的话建议收藏,点个关注!
玖柒的小窝
2021/12/07
1.1K0
Vue3 中有哪些值得深究的知识点?
Vue3快速入门——生命周期详解及代码案例
在 Vue 3 中,组件的生命周期是一个重要的概念,它描述了一个 Vue 组件从创建到销毁的过程中所经历的各个阶段。这些阶段包括组件的创建、挂载、更新和销毁等,Vue 3 提供了相应的钩子函数,允许我们在这些关键时刻执行自定义的逻辑。
小明爱吃火锅
2024/04/24
1.5K0
【Vue #1】Vue.js 介绍&声明式渲染&数据响应式
Vue.js(发音如 “View”)由 尤雨溪(Evan You)于 2014年 发布,是一个用于 构建用户界面 的 渐进式 JavaScript 框架。
IsLand1314
2025/04/08
1730
【Vue #1】Vue.js 介绍&声明式渲染&数据响应式
一文看完vue3的变化之处
之前在非组件的情况下创建实例可以使用对象,但是现在所有情况下都只能使用一个返回对象的函数。
街角小林
2022/06/15
3.1K0
Vue3 快速入门及巩固基础
Vue 是一款用于构建用户界面的 JavaScript 框架,它基于 HTML,CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效的开发用户界面
很酷的站长
2022/12/04
3.9K0
Vue3 快速入门及巩固基础
实用的VUE系列——快速使用 vue ,就要鄙视他,理解他,成为他
声明:本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
用户7413032
2024/05/07
1150
实用的VUE系列——快速使用 vue ,就要鄙视他,理解他,成为他
2024重大更新!Blog.Admin更新Vue3.0
BCVP社区自从成立以来,一直致力于在国内推广以ASP.NETCore+VUE为核心的前后端分离架构的技术传播,从几年前我自己开发代码,到现在成立了BCVP开发组的五名成员,以“学以致用,学以分享”为目的,对开源的项目也一直从未收费,也一直从未断更,其实我们每个人都是开源社区的既得利益者,只是总需要一批人去把更多的内容继续进行分享升华,BCVP开发者社区成员就是这样一批人。
老张的哲学
2024/02/22
3650
2024重大更新!Blog.Admin更新Vue3.0
推荐阅读
相关推荐
再遇vue之vue3新特性
更多 >
LV.1
微软中国高级系统工程师
目录
  • “面向接口”编程的发展历程
  • 定义接口的作用
    • 1. 做为一种行为契约
    • 2. 调用方只关注接口,不关注实现
    • 3. 用作控制反转
  • 哪些层真的需要定义接口?
    • 需要定义接口的层
    • Domain Service要不要定义接口
    • Factory要不要定义接口
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档