我对java中的松散耦合和紧耦合有一些困惑.我知道松散耦合意味着关于彼此的最少信息和紧耦合意味着依赖.我们知道松散耦合可以通过接口实现和继承实现紧密耦合.
例如:
1)A(界面)<--------------------- B(班级)
2)C(班级)<--------------------- D(班级)
假设这四个类是我整个应用程序的一部分,那么B或D中的更改不会对应用程序产生任何影响(从运行的角度来看).从A或C中删除任何方法或变量都需要在应用程序中进行如此多的更改.所有得分都是2-2,但在C或A中添加新方法是不同的.如果我在C中添加新方法不会影响应用程序但是在A中添加,至少我必须在B和所有实现接口A的类中重写此方法.所以至少在这种情况下它是如何松散耦合的.我的疑问是,继承给予总是紧密耦合.我学习继承是OOP的强大工具之一.如果一个类遵循"是一种关系"则设计然后使用继承.松耦合意味着彼此之间的信息较少.A和C都不知道将来要实现或扩展哪个类,但是在添加B和D之后,现在B不依赖于A,因为它的所有方法都是抽象的,但D也可以覆盖继承特性.
zap*_*apl 17
我们知道松散耦合可以通过接口实现和继承来实现紧密耦合.
我觉得你错了."耦合"通常是大约2个不同的类,它们通过具体类或仅通过某种接口相互了解.
假设A和B两个类需要相互通信.
A <--knows--> B
Run Code Online (Sandbox Code Playgroud)
A中的方法将具有一些参数B,而B中的方法具有类型为AEg的参数
class A {
public void talkTo(B b) {}
}
Run Code Online (Sandbox Code Playgroud)
现在这是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
Run Code Online (Sandbox Code Playgroud)
它们之间的通信通过这些接口进行
class A implements IA {
public void talkTo(IB b);
}
class B implements IB {
public void talkTo(IA a);
}
Run Code Online (Sandbox Code Playgroud)
A和IA之间的依赖关系(这似乎是你看来)并不是紧密与松散耦合的主要关系.有一些相似之处,但松耦合并不意味着你应该实现一个接口而不是扩展一个抽象类.通常,实现一个接口通常更好.
如果您可以将"IS A"关系替换为"HAS A"关系,则基本相同.你从一个具体的实现中解耦自己(例如你是A),只需要依赖封装的另一面(例如从B侧).继承确实是一个非常强大的功能,但它经常被滥用.
继承并不总是提供紧密耦合 - 因为您继承的类提供了一种定义的方法来实现这一点,通过该方法将其声明为私有、受保护和公共。
一个很好的例子是各种 API 提供的许多抽象类,它们为您实现接口的一些样板功能,并允许您专注于自己的需求。
基本示例包括 swing 中的“适配器”类,它提供接口中所有方法的“无操作”实现。更高级的示例实际上提供了接口的一些要求的标准实现。
到底什么是紧耦合实际上很大程度上是一个判断,许多事物显然是紧密耦合的,其他事物显然是松散耦合的 - 然后中间有一个很大的灰色区域。