Java当中什么是耦合、如何解(降低)耦合

什么是耦合性

耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。

什么是程序间的耦合

假如:当我去new一个对象的时候,而这个对象不存在,这个时候程序会报编译时异常,也就意味着程序连运行都运行不了,我们可以理解为他们的耦合度较高。

如何解耦

我们可以利用Java的反射技术,通过类定名,来进行反射创建对象,这个时候我们可以成功的避免编译时异常,并且保证了项目在这个时候还能正常运行。

工厂模式解耦

在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。那么,这个读取配置文件,创建和获取三层对象的类就是工厂。

针对于解耦的案例

早期我们的 JDBC 操作,注册驱动时,我们为什么不使用 DriverManager 的 register 方法,而是采用 Class.forName 的方式?

public class JdbcDemo1 {
	public static void main(String[] args) throws Exception {
	//1.注册驱动
	//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
	Class.forName("com.mysql.jdbc.Driver");
	//2.获取连接
	//3.获取预处理 sql 语句对象
	//4.获取结果集
	//5.遍历结果集
	}
}

原因就是:
我们的类依赖了数据库的具体驱动类(MySQL),如果这时候更换了数据库品牌(比如 Oracle),需要修改源码来重新数据库驱动。这显然不是我们想要的。

解决思路:
当是我们讲解 jdbc 时,是通过反射来注册驱动的,代码如下:

Class.forName("com.mysql.jdbc.Driver");// 此处只是一个字符串

此时的好处是,我们的类中不再依赖具体的驱动类,此时就算删除 mysql 的驱动 jar 包,依然可以编译(运行就不要想了,没有驱动不可能运行成功的)。同时,也产生了一个新的问题,mysql 驱动的全限定类名字符串是在 java 类中写死的,一旦要改还是要修改源码。解决这个问题也很简单,使用配置文件配置。

什么是内聚性

内聚性是一个和耦合性相对的概念,一般而言低耦合性代表高内聚性,反之亦然。

耦合性和内聚性都是由提出结构化设计概念的赖瑞·康斯坦丁所提出。低耦合性是结构良好程序的特性,低耦合性程序的可读性及可维护性会比较好。

高内聚低耦合

Java本身一个单体项目就可以完成所有的功能,为什么现在都流行按业务来对他进行拆分成多个项目,这是为什么?

就拿商城项目为例,他一般会将后端项目拆成多个,比如用户服务、订单服务,其实就是为了追求高内聚低耦合,用户服务当中就只包含用户相关的代码,也就是单一职责,这就是高内聚的表现,假如订单服务挂了,我系统照样可以登录使用,这就是低耦合的表现。

总结

以上只是说的解耦的一种思维,方便大家理解。

解耦的核心思想:若要减少代码的耦合度,一定要尽量做到各个功能的代码不能交叉编写,编写封闭的代码。

<think>首先,用户的问题是:“我想了Java耦合度的定义”。用户明确要求了Java耦合度的定义。 回顾系统级指令: - 所有行内数学表达式必须使用 $...$ 格式(但这里涉及Java代码,可能与数学无关,所以可能不需要数学格式)。 - 独立公式必须使用 $$...$$ 并单独成段(同样,可能不适用)。 - LaTeX语法正确(确保代码块正确)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如 [^1]。 用户提供了几个引用: - [^1]: 关于代码耦合度的一般概念。 - [^2]: Java代码耦合析,包括耦合度等级金字塔。 - [^3]: Java耦合度的定义和影响因素。 - [^4]: Java耦的方法。 - [^5]: 耦合的概念和分类。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是第一个用户消息。上一次的问题没有提供,因为这是新对话的开始。所以,我应该基于当前的消息。 用户的当前问题是:“我想了Java耦合度的定义”,所以我需要定义Java中的耦合度。 从引用中提取关键点: - 引用[2]:代码耦合度是衡量软件模块间依赖关系的核心指标。 - 引用[3]:耦合度就是某模块()与其它模块()之间的关联、感知和依赖的程度,是衡量代码独立性的一个指标。 - 引用[5]:耦合描述了模块之间的交互关系。 综合这些,Java中的耦合度定义: - 在Java中,耦合度指的是类或模块之间相互依赖的程度。它衡量了代码模块(如类)之间的联系有多紧密。 - 高耦合意味着类之间高度依赖,修改一个类可能影响另一个类。 - 低耦合表示类之间独立性高,易于维护和扩展。 回答结构: 1. **清晰定义**:Java耦合度的概念。 2. **影响因素**:简要提到影响耦合度的因素。 3. **类型**:简要提及耦合度的不同类型(如数据耦合、控制耦合等),参考引用[2]和[5]。 4. **示例**:由于是Java,提供一个简单的Java代码示例来阐释。 5. **生成相关问题**:在结束时生成相关问题。 6. **引用标识**:如果引用具体段落,添加引用标识。 回答语言:中文。 生成相关问题:基于主题,生成2-3个相关问题。例如: 1. 如何降低Java代码的耦合度? 2. 耦合度有哪些类型,各有什么特点? 3. 最佳实践:高内聚低耦合Java中的应用? 完整回答结构: - 开头定义耦合度。 - 释概念。 - 提供Java代码示例。 - 讨论影响和优化。 - 结束时添加相关问题。 </think>### Java耦合度的定义 在Java编程中,耦合度(Coupling)是指软件模块(如类、接口或包)之间相互依赖和关联的程度。它衡量了模块间的独立性:高耦合度表示模块紧密依赖,修改一个模块可能对其他模块造成较大影响;低耦合度则意味着模块相对独立,更容易维护、扩展和重用。耦合度是软件设计的重要指标,直接影响代码的可维护性、可测试性和灵活性[^3]。 根据引用内容,Java耦合度的核心定义包括: - **依赖关系**:一个模块(例如Java类)需要调用、感知或依赖于另一个模块的功能或数据[^3][^5]。 - **影响因素**:耦合强度取决于模块间调用的频率、传递数据的量、控制逻辑的多少以及接口的复杂度[^3][^5]。 - **目标**:在面向对象设计中,提倡“低耦合、高内聚”(低依赖、高模块独立性),以提升代码质量[^3][^4]。 #### Java耦合度示例 以下是一个简单Java代码示例,展示高耦合和低耦合的对比。示例中,`OrderProcessor`类演示了高耦合(直接依赖具体实现),而优化后的版本使用接口实现低耦合。 ```java // 高耦合示例:直接依赖具体类 public class OrderService { public void processOrder() { PaymentProcessor payment = new PaymentProcessor(); // 强依赖具体实现 payment.handlePayment(); // 调用具体方法 } } public class PaymentProcessor { public void handlePayment() { System.out.println("Processing payment..."); } } // 低耦合示例:通过接口耦 public interface PaymentService { void handlePayment(); } public class PaymentProcessor implements PaymentService { @Override public void handlePayment() { System.out.println("Processing payment..."); } } public class OrderProcessor { private PaymentService paymentService; // 依赖接口而非具体类 public OrderProcessor(PaymentService paymentService) { this.paymentService = paymentService; // 依赖注入降低耦合 } public void processOrder() { paymentService.handlePayment(); // 调用接口方法 } } ``` - **高耦合**:`OrderService`直接创建`PaymentProcessor`实例,修改`PaymentProcessor`会影响`OrderService`[^4]。 - **低耦合**:`OrderProcessor`依赖`PaymentService`接口,通过构造器注入实现耦,提升灵活性[^4][^5]。 ### 关键点总结 - Java耦合度强调模块间交互的强度,例如通过参数传递(数据耦合)或全局变量(公共耦合)[^2][^3]。 - 优化策略包括使用接口、依赖注入(如Spring框架)或设计模式(如工厂模式),以减少直接依赖[^4]。 - 理想状态是追求“数据耦合”或“无直接耦合”(模块间无直接调用),以确保代码易于重构和测试[^2][^5]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值