oop中的松散耦合和紧耦合是什么(java)

时间:2013-12-07 19:59:46

标签: java oop

我对java中的松散耦合和紧耦合有一些困惑。我知道松散耦合意味着关于彼此的最少信息和紧耦合意味着依赖。我们知道松散耦合可以通过接口实现和继承来实现紧密耦合。 / p>

例如:

1)A(界面)< --------------------- B(class)

2)C(class)< --------------------- D(class)

假设这四个类是我整个应用程序的一部分,使B或D中的更改不会对应用程序产生任何影响(从运行的角度来看)。从A或C中删除任何方法或变量都需要在应用程序中进行如此多的更改。所有得分都是2-2,但在C或A中添加新方法是不同的。如果我在C中添加新方法不会影响应用程序但是在A中添加,至少我必须在B和所有实现接口A的类中重写此方法。所以至少在这种情况下它是如何松散耦合的。    我的疑问是,继承给予总是紧密耦合。我学习继承是OOP的强大工具之一。如果一个类遵循“是一种关系”则设计然后使用继承。   松耦合意味着彼此之间的信息较少。 A和C都不知道将来要实现或扩展哪个类,但是在添加B和D之后,现在B不依赖于A,因为它的所有方法都是抽象的,但D也可以覆盖继承特性。

5 个答案:

答案 0 :(得分:16)

  我们知道松散耦合可以通过接口实现和继承来实现紧密耦合。

我认为你错了。 “耦合”通常是大约2个不同的类,它们通过具体类或仅通过某种接口相互了解。

假设有两个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之间的依赖关系(这似乎是你看来的)并不是紧密与松散耦合的主要关系。有一些相似之处,但松耦合并不意味着你应该实现一个接口而不是扩展一个抽象类。通常,实现一个接口通常会更好。

如果您可以将“IS A”关系替换为“HAS A”关系,则基本相同。你从一个具体的实现中解耦自己(例如你是A),只需要依赖封装的另一面(例如从B面)。继承确实是一个非常强大的功能,但它经常被滥用。

答案 1 :(得分:3)

简介松散和紧密耦合

松散耦合意味着减少直接使用不同类的类的依赖关系。在紧耦合中,类和对象彼此依赖。一般来说,紧耦合通常是不好的,因为它会降低代码的灵活性和可重用性,并且会使更改变得更加困难并妨碍可测试性等。

紧耦合

紧密耦合对象是一个需要了解其他对象的对象,并且通常高度依赖于彼此的接口。在紧密耦合的应用程序中更改一个对象通常需要更改许多其他对象。在一个小应用程序中,我们可以轻松识别更改,并且错过任何内容的机会较少。但是在大型应用程序中,每个程序员并不总是知道这些相互依赖性,或者有可能忽略变化。但是每组松散耦合的对象并不相互依赖。

答案 2 :(得分:2)

继承并不总是提供紧密耦合 - 因为您继承的类提供了一种定义的方法,通过该方法声明它是私有的,受保护的和公共的。

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

基本示例包括swing中的“adapter”类,它提供了接口中所有方法的“no-op”实现。更高级的示例实际上提供了接口的一些要求的标准实现。

究竟什么是紧耦合实际上是一个非常多的判断调用,很多东西显然是紧耦合的,其他的显然是松耦合的 - 然后是一个大的灰色区域。

答案 3 :(得分:0)

有三个问题或层......实现关注,对象创建问题和使用问题。当我们编程到一个接口而不是一个实现时,我们可以实现松耦合..意味着实现层中的任何变化都会产生最小的影响在对象创建层............

答案 4 :(得分:0)

  

一般答案和差异

松耦合配置

  • 每个处理器都有自己的内存模块。
  • 它不能遇到内存冲突。
  • 它具有消息传输系统。
  • 低数据速率。
  • 价格便宜。
  • 动态绑定。
  • 隐式升级。
  • 平台无关。
  • 异步通信样式。

紧密耦合配置

  • 处理器具有共享内存。
  • 它遇到更多的内存冲突。
  • 它具有互连网络。
  • 高数据速率。
  • 更昂贵。
  • 强大的系统。
  • 静态绑定。
  • 明确升级。
  • 平台依赖项。
  • 同步通信样式。