问题描述
很抱歉,我的英语提问很长。
我正在读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
变得毫无用处。