1

很抱歉这个问题很长,还有我的英语。

我正在阅读一篇关于 DIP 的文章。我将在这里总结代码。

interface CoffeeMachine() {
    void brewFilterCoffee();
}

interface EspressoMachine() {
    void brewEspressoCoffee();
}

他们创建了两个不同的 CoffeeMachine。BasicCoffeeMachine 和 PremiumCoffeeMachine。它们都具有相同的功能是 brewFilterCoffee(); 所以他们把它放在CoffeeMachine界面上

class BasicCoffeeMachine implements CoffeeMachine {
    @Override
    void brewFilterCoffee() {
        System.out.println("brewing filter coffee...");
    }
}

// this one can make Espresso
class PremiumCoffeeMachine implements CoffeeMachine, EspressoMachine {
    @Override
    void brewFilterCoffee() {
        System.out.println("brewing filter coffee but in premium way...");
    }

    @Override
    void brewEspressoCoffee() {
        System.out.println("brewing espresso coffee...");
    }
}

当他们创建CoffeeApp时,它在构造函数中接受CoffeeMachine接口并使用它来prepareCoffee()

class CoffeeApp {
    CoffeeMachine machine;
    
    public CoffeeApp(CoffeeMachine machine) {
        this.machine = machine;
    }
    
    public void prepareCoffee() {
        machine.brewFilterCoffee();
    }
}

在主班。

class Main {
    public static void main(String[] args) {
        PremiumCoffeeMachine premiumCoffeeMachine = new PremiumCoffeeMachine();
        CoffeeApp app = new CoffeeApp(premiumCoffeeMachine);

        app.brewFilterCoffee();
    }
} 

我在这里感到困惑,因为他们没有提到他们如何在 CoffeeApp 中使用brewEspressoCoffee()。所以我继续像这样修改CoffeeApp:

class CoffeeApp {
    public void prepareFilterCoffee(CoffeeMachine machine) {
        machine.brewFilterCoffee();
    }
    
    public void prepareEspressoCoffee(EspressoMachine machine) {
        machine.brewEspressoCoffee();
    }
}

在 Main 类中,如果我想brewEspressoCoffee(),我只需创建一个实现EspressoMachine的实例

class Main {
    public static void main(String[] args) {
        PremiumCoffeeMachine premiumCoffeeMachine = new PremiumCoffeeMachine();
        CoffeeApp app = new CoffeeApp();

        app.brewEspressoCoffee(premiumCoffeeMachine);
    }
} 

这还是下面的DIP吗?还有比这个例子更好的方法吗?任何示例将不胜感激。

谢谢!!

4

1 回答 1

0

我想你已经抓住了 DIP 的精髓,那就是你总是可以插入一个接口来反转依赖的方向。

除了遵循 DIP 之外,这里还需要考虑信息隐藏原则。我们经常认为 IH 应用于数据,但它也适用于依赖项。

在原始CoffeeApp中,客户(客户)对 没有依赖,EspressoMachine并且对 有间接(传递)依赖CoffeeMachine。在修改后CoffeeApp的 中,客户端直接依赖于两个机器接口。

这些依赖是抽象的,所以 DIP 是满足的;但它引出了一个问题,如果CoffeeApp将其依赖项暴露给其客户,那么它的目的是什么?客户端可以直接调用这些依赖项。通过传递其依赖关系,CoffeeApp变得无用。

于 2020-10-07T19:19:35.733 回答