实现多个接口时,这仍然遵循依赖反转原则吗?

问题描述

很抱歉,我的英语提问很长。

我正在读an article about 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();
    }
}

在Main class中。

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吗?还有没有比这个例子更好的方法了?任何示例将不胜感激。

谢谢!

解决方法

我认为您已经掌握了DIP的本质,那就是您可以始终插入一个接口以反转依赖项的方向。

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

在原始CoffeeApp中,客户端(客户)不依赖于EspressoMachine,而间接(传递)依赖于CoffeeMachine。在修改后的CoffeeApp中,客户端直接依赖于两个计算机接口。

这些依赖关系是抽象的,因此DIP可以满足;但这引出了一个问题,如果CoffeeApp向客户公开其依赖项,那么它的目的是什么?客户端可以直接调用这些依赖关系。通过传递其依赖性,CoffeeApp变得毫无用处。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...