什么是面向对象编程中的松耦合和紧耦合(Java)?
什么是面向对象编程中的松耦合和紧耦合(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也可以覆盖继承功能。
正如我们所知,通过接口实现和继承,可以实现松耦合,而通过继承实现则会形成紧耦合。
我觉得你弄错了。通常情况下,“耦合”指的是两个不同的类彼此了解,可以是它们的具体类或者以某种接口相互了解。
假设两个类 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的一侧)。继承确实是一项非常强大的功能,但它经常被误用。