当前位置: 首页 > 面试题库 >

在接口级别分离两个类意味着什么?

萧秋月
2023-03-14
问题内容

假设我们在A包中有A类,在B包中有B类。如果类A的对象引用了类B,则称这两个类之间具有耦合。

为了解决耦合问题,建议在包A中定义一个接口,该接口由包B中的类实现。然后,类A的对象可以引用包A中的接口。这通常是“依赖倒置”的一个例子。

这是“在接口级别将两个类解耦”的示例。如果是,当两个类耦合时,它如何消除类之间的耦合并保持相同的功能?


问题答案:

让我们创建一个虚拟的例子。

A套餐类别packageA

package packageA;

import packageB.B;

public class A {
    private B myB;

    public A() {
        this.myB = new B();
    }

    public void doSomethingThatUsesB() {
        System.out.println("Doing things with myB");
        this.myB.doSomething();
    }
}

B套餐类别packageB

package packageB;

public class B {
    public void doSomething() {
        System.out.println("B did something.");
    }
}

如我们所见,A取决于B。没有BA则不能使用。但是,如果B将来我们想用a 代替BetterB呢?对于这一点,我们创建了一个界面InterpackageA

package packageA;

public interface Inter {
    public void doSomething();
}

为了利用这个界面,我们

  • import packageA.Inter;B implements InterB
  • 替换出现的所有BAInter

结果是该版本的A

package packageA;

public class A {
    private Inter myInter;

    public A() {
        this.myInter = ???; // What to do here?
    }

    public void doSomethingThatUsesInter() {
        System.out.println("Doing things with myInter");
        this.myInter.doSomething();
    }
}

我们已经看到,从A到的依赖关系B消失了:import packageB.B;不再需要。仅存在一个问题:我们无法实例化接口的实例。但是控制权的转换很容易解决:与其Inter在A构造函数中实例化某种类型的东西,构造器将需要一些implements Inter作为参数的东西:

package packageA;

public class A {
    private Inter myInter;

    public A(Inter myInter) {
        this.myInter = myInter;
    }

    public void doSomethingThatUsesInter() {
        System.out.println("Doing things with myInter");
        this.myInter.doSomething();
    }
}

通过这种方法,我们可以改变现在的具体实施Inter中A随意。假设我们编写了一个新类BetterB:

package packageB;

import packageA.Inter;

public class BetterB implements Inter {
    @Override
    public void doSomething() {
        System.out.println("BetterB did something.");
    }
}

现在我们可以实例化A具有不同的Inter实现:

Inter b = new B();
A aWithB = new A(b);
aWithB.doSomethingThatUsesInter();

Inter betterB = new BetterB();
A aWithBetterB = new A(betterB);
aWithBetterB.doSomethingThatUsesInter();

而且我们不必更改其中的任何内容A。现在,代码已解耦Inter,只要满足合同,我们就可以随意更改的具体实现Inter。最值得一提的是,我们可以支持将在以后编写并实现的代码Inter。



 类似资料:
  • 假设A包中有A类,B包中有B类。如果类A的对象引用了类B,那么这两个类之间就称为耦合。 为了解决耦合问题,建议在包A中定义一个接口,该接口由包B中的类实现。然后,类A的对象可以引用包A中的接口。这通常是《依赖倒置》中的一个例子。 这是不是“在接口层解耦两个类”的例子,如果是,它是如何去除类之间的耦合,并在两个类耦合时保留相同的功能的?

  • 问题内容: 假设我们在A包中有A类,在B包中有B类。如果类A的对象引用了类B,则称这两个类在它们之间具有耦合。 为了解决这种耦合,建议在包A中定义一个接口,该接口由包B中的类实现。然后,类A的对象可以引用包A中的接口。这通常是“依赖倒置”的一个例子。 这是“在接口级别将两个类解耦”的示例。如果是,当两个类耦合时,它如何消除类之间的耦合并保持相同的功能? 问题答案: 让我们创建一个虚拟的例子。 套餐

  • 你能详细解释一下吗?最后给我举个例子(一个是附加的,一个是分离的),说明iText分离签名的确切含义? 我发现了这个精彩的留档: iText数字签名pdf关于iText数字签名,但我仍然不确定我是否理解iText分离签名的概念。 阅读文档(参见链接),我发现了以下定义: 在PDF中,我们有时指的是分离的签名。根据维基百科的说法,分离签名是一种“与签名数据分离”的数字签名,而不是“捆绑在一起形成一个

  • 问题内容: 我刚刚看到一个成员函数,如下所示: 但是Cat是这样的接口: 因此,我对如何解释这一点感到困惑。我知道什么东西返回一个对象或原语是什么意思。但是返回接口意味着什么?如何使用此函数的返回值? 问题答案: 考虑一下这种方式:如果在常规类的哪里,当您想在其上调用某些方法时,您 究竟 在乎什么呢? 您会关心方法定义:它们的名称,它们的参数类型,它们的返回值。你 并不 需要关心实际的实现! 由于

  • 我正在尝试测量运行基准测试时消耗的内存。我在网上发现我可以使用< code>GC profiler来测量它。我试过了,但是我不明白答案,也看不出消耗的内存量。有人能解释这个结果吗?谢了。

  • 我想创建一个