在 Kathy sierra 的“Head First Servlets and Jsp”一书中,第 744 页
上面提到,“当A类想使用B类中的方法时,一个很常见的做法是在两者之间创建一个接口。B类实现了这个接口后,A类就可以通过该接口使用B类了。”
我的问题是 A 类如何使用 B 类,因为它们可能通过实现相同的接口而具有相同的方法签名,但这些方法的实现会有所不同?有人可以解释一下吗?
我认为有一点误解:A 和 B 不会都实现接口,我们称它为 C。只有 B 会实现 C。诀窍是现在 A 可以消除对 B 的所有直接引用而只使用 C,只要有一个A 可以通过某种方式获取实现 C 的对象,例如通过工厂。这样,您可以用完全不同的 C 实现替换 B,而不会破坏 A 中的代码。
接口是一组具有空主体的相关方法。
它更像是一份合同。当您拥有一台电视机时,按钮充当一个打开和关闭它的界面。这是您与电视之间的合同,您将使用这些界面来获得电视的最大收益。
例如,如果将自行车的行为指定为接口,则可能如下所示:
interface Bicycle {
// wheel revolutions per minute
void changeCadence(int newValue);
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
要实现这个接口,你的类的名字会改变(比如特定品牌的自行车,例如 ACMEBicycle),你可以在类声明中使用 implements 关键字:
class ACMEBicycle implements Bicycle {
// remainder of this class
// implemented as before
}
希望这可以帮助。
松散耦合表示依赖关系,但不是显式引用。接口是一种通过提供独立于 a) 实现和 b) 继承树的成员声明来实现松散耦合的机制。
举个ClassA
例子。ClassA
实现接口IService
。
MyMethod(ClassA input)
依赖于ClassA
.
MyMethod(IService input)
依赖于IService
但不依赖于ClassA
。MyMethod(IService)
将编译没有ClassA
- 它是松散耦合的。
综上所述。松散耦合允许两个组件参与一个机制,但它不会在它们之间进行显式引用。
一些示例代码(C#,但如果您了解 Java,应该可以理解):
// this interface defines what A should be able to do with B
interface SomeInterface
{
int GetSomeValue();
}
// B needs to implement this interface
class B : SomeInterface
{
int GetSomeValue()
{
return 42;
}
void SomeOtherMethod()
{
}
}
// A has access to B via the interface. Pass it in the constructor and save it for later use
class A
{
A(SomeInterface si)
{
this.si = si;
}
SomeInterface si;
// or pass it per call
void SomeMethodInA(SomeInterface passedIF)
{
int c = passedIF.GetSomeValue();
}
// may even have the same name but doesn't have to!
int GetSomeValue()
{
// access "B" (or some other class implementing this interface) via the interface
return si.GetSomeValue() + 1;
}
// The interface can of course be also a property of A.
// but this is left as an exercise to the reader
}
int main()
{
B b = new B();
A a = new A(b);
a.GetSomeValue();
a.SomeMethodInA(b);
}