当我们必须创建一个实现类时,松散耦合如何与接口相关联?实现类被强制实现接口中定义的所有方法。我不明白这是如何允许失去耦合的?我是面向对象编程和软件设计的新手,所以如果你能对这个主题有所了解,那将会非常有用。一个例子就是锦上添花。
答案 0 :(得分:11)
关键是接口不仅允许你编写一个实现它的类,它允许你写几个。
当您拥有通过使用接口与类交互的代码时,该代码能够与实现所述接口的任何类一起工作,无论它如何实现它。这允许您将不同的类提供给相同的代码而无需修改它。
请注意,接口不是达到松散耦合组件的唯一方法。松散耦合仅意味着组件能够一起工作而不会假设彼此的内部工作。这样做是因为您的组件越多地将对方视为黑盒子,就越容易在一个组件上进行更改而不影响任何其他组件。接口可以是实现这一目标的一种工具,但它们都不是必需的,它们也不是唯一值得一提的工具。
答案 1 :(得分:9)
实现类能够选择如何实现该功能。
public interface PersonRepository {
Person getPerson(String name);
}
可以通过阅读CSV文件或查询数据库来实现。需要这个人的对象并不关心这个人是如何被发现或装载的。
因此,它被认为是松散耦合的。如果它是紧密耦合的,则需要知道如何构造SQL查询或读取CSV文件。
答案 2 :(得分:1)
客户端代码耦合到接口。它没有与实现相结合。您可以在不编译客户端代码或界面的情况下更改实现。
请参阅http://en.wikipedia.org/wiki/Dependency_inversion_principle和http://en.wikipedia.org/wiki/Open/closed_principle
答案 3 :(得分:0)
可能在下面的解释中可以回答此问题:
进入类A,我们需要具有类B的对象。如果直接将B暴露在A中,则意味着存在紧密耦合。例如:可以向B中添加更多方法或其他任何方法。 这意味着可以基于更多的B暴露来更改A的行为。但是,如果B类正在实现任何接口,并且我们将接口的引用传递给A。这意味着B类的任何更改对进一步的用户A类都不会造成麻烦,因为我们使用用于访问B的接口的ref,并且仅具有必需的访问权限。 例如: A类{ 公共无效添加(BB){ //实现 } } 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.