什么是面向对象编程中的松耦合和紧耦合(Java)?

8 浏览
0 Comments

什么是面向对象编程中的松耦合和紧耦合(Java)?

我对Java中的松耦合和紧耦合存在一些困惑。据我所知,松耦合意味着彼此了解的信息最少,而紧耦合意味着依赖性。我们知道,可以通过接口实现和继承来实现松耦合,而继承使紧耦合。

例如:

1)A(接口)<---------------------B(类)

2)C(类)<---------------------D(类)

假设这四个类是我的整个应用程序的一部分,对B或D进行更改不会对应用程序产生任何影响(从运行角度来看)。从A或C中删除任何方法或变量会导致应用程序进行很多更改。所有正确的得分都是2-2,但在C或A中添加新方法是不同的。如果我在C中添加新方法,对应用程序没有影响,但如果我在A中添加新方法,则至少必须在B中重写此方法,以及实现接口A的所有类。所以这个场景中它是松耦合的吗?

我的疑虑是,继承是否总是会导致紧耦合。我学到过,继承是面向对象编程中强大的工具之一。如果一个类遵循“是一个关系”,那么使用继承。

松耦合意味着互相知道的信息要少。A和C在未来都不知道哪个类会实现或扩展,但是在添加了B和D之后,B不再依赖于A,因为它的所有方法都是抽象的,但是D也可以覆盖继承功能。

admin 更改状态以发布 2023年5月19日
0
0 Comments

继承并不总是给出紧密的耦合——因为你继承的类提供了一种定义良好的途径,通过这种途径,它声明了哪些方法是私有的、受保护的和公共的。

一个很好的例子就是各种 API 提供的抽象类,它们为您实现了接口的一些样板功能,并允许您关注自己的需求。

基本的例子包括 Swing 中提供的“适配器”类,它为接口中的所有方法提供“空操作”实现。更高级的例子实际上为接口的一些需求提供了标准实现。

究竟紧密耦合是什么,这实际上很大程度上取决于判断,有许多东西显然是紧密耦合的,而其他东西则显然是松散耦合的,然后在中间有一个很大的灰色区域。

0
0 Comments

正如我们所知,通过接口实现和继承,可以实现松耦合,而通过继承实现则会形成紧耦合。

我觉得你弄错了。通常情况下,“耦合”指的是两个不同的类彼此了解,可以是它们的具体类或者以某种接口相互了解。

假设两个类 A 和 B 需要相互通信。

 A <--knows--> B

在 A 类的方法中,需要有一个 B 类的参数,在 B 类的方法中需要有一个类型为 A 的参数,比如:

 class A {
     public void talkTo(B b) {}
 }    

现在,A 和 B 之间的耦合非常紧密,因为对这些类所做的任何更改都有可能需要对另一个类进行更改。

如果以松散耦合的方式进行,它们都将通过某些接口公开自己。 (“接口”也可以是抽象类-这是各方面的选择。)

   IA  <-- A
     ^     |
      \   /
        X           < loose coupling between the A side and the B side
      /   \
     v     |
   IB  <-- B     < pretty tight coupling betwen IB and B

它们之间的通信通过这些接口进行。

   class A implements IA {
        public void talkTo(IB b);
   }
   class B implements IB {
        public void talkTo(IA a);
   }

A 和 IA 之间的依赖关系(这似乎是您所关注的)并不是紧密耦合与松散耦合主要有关的问题。虽然有些相似之处,但是松散耦合并不意味着您应该实现一个接口而不是扩展抽象类。不过通常最好只实现一个接口。

如果您可以用“HAS A”关系替代“IS A”关系,您就可以完成相同的工作。 您将自己解耦(例如,您是A),不再需要依赖于具体的实现,只需要依赖于封装的另一侧(例如,从B的一侧)。继承确实是一项非常强大的功能,但它经常被误用。

0