难以理解通过接口的松散耦合

时间:2013-09-12 14:00:56

标签: java oop

在Kathy sierra的“Head First Servlets and Jsp”一书中,第744页

提到, “当A类想要在B类中使用方法时,一种非常常见的方法是在两者之间创建一个接口。一旦B类实现了这个接口,A类就可以通过接口使用B类。”

我的问题是A类如何使用B类,因为它们可能通过实现相同的接口具有相同的方法签名,但这些方法的实现会有所不同? 有人可以解释一下吗?

4 个答案:

答案 0 :(得分:2)

我认为存在轻微的误解: A和B都不会实现接口,让我们称之为C.只有B会实现C.诀窍是现在A可以消除对B的所有直接引用并且只使用C,前提是A有一种方式可以以某种方式获得一个实现C的对象,例如通过工厂。这样你可以用完全不同的C实现替换B而不破坏A中的代码。

答案 1 :(得分:2)

An interface是一组带有空体的相关方法。

  

这更像是合同。当你有一台电视机时,   按钮充当n接口,可以将其打开并关闭。那   是您和将要使用的电视之间的合同   那些接口可以最大限度地发挥电视的作用。

例如,自行车的行为(如果指定为界面)可能如下所示:

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
}

希望这有帮助。

答案 2 :(得分:1)

松散耦合表示依赖关系,但不是显式引用。接口是一种通过独立于a)实现和b)继承树提供成员声明来实现松散耦合的机制。

ClassA为例。 ClassA实现了接口IServiceMyMethod(ClassA input)依赖于ClassA

MyMethod(IService input)取决于IService,但不取决于ClassA。 <{1}}将在没有MyMethod(IService)的情况下进行编译 - 它是松散耦合的。

总之。松散耦合允许两个组件参与机制,但它们之间没有明确的引用。

答案 3 :(得分:1)

一些示例代码(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);
}