12

当我们无论如何都要创建一个实现类时,松耦合如何与接口相关联?实现类被迫实现接口中定义的所有方法。我不明白这如何允许失去耦合?我是面向对象编程和软件设计的新手,所以如果你能对这个主题有所了解,那将非常有帮助。一个例子完全是锦上添花。

4

5 回答 5

13

关键点是接口不仅允许您编写一个实现它的类,它还允许您编写多个。

当您的代码通过使用接口与类交互时,该代码能够与实现所述接口的任何类一起工作,无论它如何实现它。这允许您将不同的类提供给相同的代码,而无需修改它。

请注意,接口并不是实现组件松散耦合的唯一方法。松散耦合只是意味着组件能够一起工作,而无需对彼此的内部工作做出任何假设。您这样做是因为您的组件越将彼此视为黑匣子,就越容易在一个组件上进行更改而不影响其他任何组件。接口可以是实现这一目标的一种工具,但它们既不是必需的,也不是在这方面值得一提的唯一工具。

于 2013-10-20T22:33:53.983 回答
8

实现类可以选择如何实现功能。

public interface PersonRepository {
    Person getPerson(String name);
}

可以通过读取 CSV 文件或查询数据库来实现。需要人的对象并不关心人是如何被发现或装载的。

因此,它被认为是松散耦合的。

如果它是紧密耦合的,则需要知道如何构造 SQL 查询或读取 CSV 文件。

于 2013-10-20T22:32:52.150 回答
1

客户端代码与接口耦合。它与实现无关。您可以在不编译客户端代码或接口的情况下更改实现。

请参阅http://en.wikipedia.org/wiki/Dependency_inversion_principlehttp://en.wikipedia.org/wiki/Open/closed_principle

于 2013-10-21T01:46:55.100 回答
0

可能下面的解释可以回答这个问题:

进入A类,我们需要B类的对象。如果将B直接暴露到A中,则意味着存在紧耦合。例如:可以将更多方法添加到 B 或任何东西中。这意味着可以根据 B 的更多曝光来更改 A 的行为。但是如果 B 类正在实现任何接口并且我们将该接口的引用传递给 A。意味着 B 类中的任何更改进一步用户 A 类都不会打扰,因为我们使用用于访问 B 的接口的 ref 并且只获得了必需的访问权限。例如:class A { public void add( B b){ // 实现 } } class B{

    }
            this is Tight coupling. Because user can make any changes to class B which are directly exposed to class A and this defines Tight Coupling(Greater the exposure of depending Object , more Tight Coupling).  To resolve this one refer :
    Interface L{

    }
    class B implements L{}
    class A{
        public void add(L  b){
            // Implementation
        }
    }

        Since we are passing the ref of Interface L, adding changes into Implementation of B will not make any difference to class A.
于 2019-07-16T03:10:08.000 回答
0

恕我直言,接口不能解决您描述的耦合问题。它们解决了实现耦合问题。只要您使用接口,您就不会知道您选择的实现。但是你仍然绑定到那个界面。而你所描述的,所谓的耦合仍然存在。为了减少调用耦合,您必须使用另一种方法,即命令模式

于 2021-09-11T21:42:56.053 回答