Java开发中的分层开发和整洁架构

news2024/11/26 17:31:20

分层开发(横向拆分)

分层开发的概念:

  • maven多模块开发项目管理.
  • 可以利用这种管理功能,实现一个项目的多层次模块开发–分层开发.
    比如,当前项目HelloController依赖HelloService
    在这里插入图片描述
  • 这样做目的: 复杂开发过程.解耦(不调整依赖关系,无法解耦).
  • 分层开发(横向拆分)和纵向拆分的区别在于,拆出多层,最终运行也是一个项目.

整洁架构

<<代码整洁之道>>作者Bob大叔曾经说过
翻译过来:
程序架构总是一样的.
让程序运行很简单.
让程序"正确"很难.
让程序维护简单,扩展简单就是正确
以 controller–service-mapper 为例,按照直觉分层开发,做依赖关系.
在这里插入图片描述
问题1: 没有实现控制层,对持久层之间的隔离关系,可以随意的在controller中注入,依赖mapper
在这里插入图片描述
问题2: 架构分层之间是纯粹强耦合.
在这里插入图片描述
分层开发没有达到最终的目的,实现解耦,实现扩展维护方便.
对应以上问题,在bob大叔的 <<整洁架构之道>>中,提到的解决的思想.

整洁架构落地方案

核心点: 分层的众多模块中,有最核心的业务模块(service).

其他的模块,包括controller,redis,rocketmq,mysql,mybatis这些模块切分出来,都是容易被替换掉的.
核心稳定的模块,如果依赖了容易变动不稳定模块,不满足整洁架构的思想.
解决方案: 依赖倒置(开发原则)

依赖倒置

  • 依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计中的一项重要原则。它主要包含两个核心概念:
    1. 高层模块不应该依赖于低层模块的具体实现,而应该依赖于抽象。
    2. 抽象不应该依赖于具体实现,而应该依赖于更高层次的抽象。
  • 简而言之,依赖倒置原则提倡程序的高层模块和低层模块都应该依赖于抽象,而不是具体的实现细节。这样可以解耦系统的各个模块,达到易于扩展、灵活性高的设计效果。

以下是一些实践依赖倒置原则的方法:

  • 依赖注入(Dependency Injection,DI):通过依赖注入的方式,将依赖关系从代码内部移动到外部容器中管理。通过接口或抽象类定义依赖关系,并将具体实现通过构造函数、属性或方法参数的方式注入到使用者中。
  • 接口编程:使用接口或抽象类作为模块之间的约定,使得高层模块与低层模块之间的依赖关系建立在抽象上,而不是具体的实现类上。
  • 面向接口编程:在设计和开发过程中,尽量使用接口来定义模块之间的交互,而不是直接依赖于具体的类。这样可以提高系统的灵活性和可维护性。
  • 通过遵循依赖倒置原则,可以提高代码的可测试性、可扩展性和解耦度,使系统更易于维护和理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过问题解决者手册推动你的结果 - 提高思维能力的 17 种方法

大部分人对产品管理的理解都是解决问题&#xff0c;这是他们的主要工作——找出客户的问题是什么并解决它们。但现在&#xff0c;热衷于解决问题的问题是&#xff0c;当我们看到问题时&#xff0c;本能反应是“我该如何解决它&#xff1f;” 这意味着&#xff1a;当我试图自己解…

26道Android 常规题,不会还不知吧?

目录 1.如何对 Android 应用进行性能分析 2.什么情况下会导致内存泄露 3.如何避免 OOM 异常 4.Android 中如何捕获未捕获的异常 5.ANR 是什么&#xff1f;怎样避免和解决 ANR&#xff08;重要&#xff09; 6.Android 线程间通信有哪几种方式 7.Devik 进程&#xff0c;lin…

今年这情况。。。大家还是多做一手准备吧

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;又得准备面试了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&a…

外观模式-提供统一入口

在办理流量套餐的时候&#xff0c;我们可以去官网查查询套餐&#xff0c;找出符合我们需求的套餐&#xff0c;然后进行办理。官网是充斥着各种各样的套餐&#xff0c;如果我们一个个去查看这些套餐&#xff0c;耗费的时间很多。而且在办理套餐的时候&#xff0c;步骤也比较多。…

提高公文写作效率,可以采用模板和样例来辅助写作

采用模板和样例是提高公文写作效率的一种常见方法。 模板是指已经制作好的公文格式和结构模板&#xff0c;可以根据模板来组织和排版自己的文章&#xff0c;以减少排版时间和排版错误。常见的模板包括各类公文格式&#xff0c;例如通知、报告、请示等等。在使用模板的过程中&am…

[MyBatis] Invalid bound statement (not found)解决方案

这个问题是由于mapper接口和mapper映射文件&#xff08;xml&#xff09;没有关联起来而导致的 出现这个问题请检查以下三处&#xff1a; 1、mapper接口所在包&#xff08;package&#xff09;的目录和xml映射文件所在的目录&#xff08;directory&#xff09;是否相同 特别要…

python的可迭代对象

一、介绍 在Python中&#xff0c;可迭代对象是指实现了__iter__()方法的对象&#xff0c;它可以通过调用iter()函数返回一个迭代器对象。可迭代对象可以是容器对象&#xff08;如列表、元组、集合、字典等&#xff09;&#xff0c;也可以是自定义的对象。 二、实例 以下是一…

Security+备考我想分想这几点

考试初衷 本人是一名信息安全从业者&#xff0c;听过很多信息安全方面的认证&#xff0c;如CISP、CISSP、CISA&#xff0c;但是没听过Security认证&#xff0c;偶然的机会&#xff0c;我的同事给我介绍了谷安&#xff0c;从这里我才了解到还有Security认证这么一个信息安全认证…

【嵌入式Linux项目】基于Linux的全志H616开发板智能家居项目(语音控制、人脸识别)

目录 一、功能需求 二、开发环境 1、硬件&#xff1a; 2、软件&#xff1a; 3、引脚分配&#xff1a; 三、关键点 1、设计模式之工厂模式 2、wiringPi库下的相关硬件操作函数调用 3、语音模块的串口通信 4、线程 5、摄像头的实时监控和拍照功能 6、人脸识别 四、编…

4个特别使用做图标设计的软件,赶紧收藏

图标设计软件是设计师日常工作中经常使用到的设计软件之一&#xff0c;本文精选了4个好用的图标设计软件为大家推荐&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款免费的&#xff0c;支持成员在线协作的图标设计软件&#xff0c;它提供了强大的设计功能和…

Kafka 入门到起飞 - Kafka怎么做到保障消息不会重复消费的? 消费者组是什么?

Kafka怎么做到避免消息重复消费的&#xff1f; 消费者组是什么&#xff1f; 消费者&#xff1a; 1、订阅Topic&#xff08;主题&#xff09; 2、从订阅的Topic消费&#xff08;pull&#xff09;消息&#xff0c; 3、将消费消息的offset&#xff08;偏移量&#xff09;保存在K…

Navicat 设置时间默认值(当前最新时间)

目录 前言1. 原理分析2. datetime和timestamp的区别3. 补充 前言 文章较短&#xff0c;但是体会很深&#xff01;&#xff01;&#xff01;&#xff01; 1. 原理分析 需求任务&#xff1a;填写数据的时候&#xff0c;如果时间不写&#xff0c;数据会默认用最新时间补充 一开…

Vue 本地应用 图片切换 v-show v-bind实践

点击切换图片的本质&#xff0c;其实修改的是img标签的src属性。 图片的地址有很多个&#xff0c;在js当中通过数组来保存多个数据&#xff0c;数组的取值结合索引&#xff0c;根据索引可以来判断是否是第一张还是最后一张。 图片的变化本质是src属性被修改了&#xff0c;属性…

【Python入门【推导式创建序列、字典推导式、集合推导式】(九)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

数学随想:轻量级算法服务。

数学随想&#xff1a;轻量级算法服务TOC 通常认为&#xff0c;数列是算法服务的基础。但是&#xff0c;真正用于算法服务的数列只有几个众所周知的基础数列。虽然对于不同的任务可以选择使用数列的一段用于服务&#xff0c;但是数列的使用还是复杂而繁重的。特别是在计算应用日…

工控机有哪些常见的硬件和软件组件?

工控机常用于制造业、自动化控制、机械设备、医疗设备、交通运输、能源管理、环境监测、安防监控等行业和领域。它们可以用于控制、监控、数据采集和处理、自动化生产线等方面。 工控机有哪些常见的硬件和软件组件&#xff1f; 工控机作为一种特殊的计算机设备&#xff0c;通…

《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

文章目录 1. 概述1.1 目的1.2 实现方式 2. 代码示例2.1 设计2.2 代码 1. 概述 1.1 目的 保证类只有一个实例有方法能让外部访问到该实例 1.2 实现方式 懒汉式 在第一次调用单例对象时创建该对象&#xff0c;这样可以避免不必要的资源浪费 饿汉式 在程序启动时就创建单例对象…

你真的懂软件测试人员的痛苦吗?——目前软件测试几大误区

前言 随着软件测试对提高软件质量重要性的不断提高&#xff0c;软件测试也不断受到重视。但是&#xff0c;国内软件测试过程的不规范&#xff0c;重视开发和轻视测试的现象依旧存在。因此&#xff0c;对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&a…

[ 容器 ] Docker 网络

目录 一、 Docker 网络实现原理二、Docker 的网络模式三、网络模式讲解1. host 模式2&#xff0e;container模式3&#xff0e;none模式4&#xff0e;bridge模式5&#xff0e;自定义网络 四、资源控制1. CPU 资源控制2 对内存使用限制3. 对磁盘IO配额控制&#xff08;blkio&…

大数据技术之Hive3

目录标题 5、DML 数据操作5.1 数据导入5.1.1 向表中装载数据load5.1.2 通过查询语句向表中插入数据insert5.1.3 查询语句中创建表并加载数据5.1.4 创建表时通过 Location 指定加载数据路径 5.2 数据导出5.2.1 insert导出5.2.2 Hadoop 命令导出到本地 5.3 清除表中数据(Truncate…