实现多接口时是否仍然遵循依赖倒置原则?
Is this still follow Dependency Inversion Principle when implement multiple interface?
抱歉问了这么长的问题,还有我的英语。
我正在阅读 an article about DIP。我将在这里总结代码。
interface CoffeeMachine() {
void brewFilterCoffee();
}
interface EspressoMachine() {
void brewEspressoCoffee();
}
他们创建了两个不同的咖啡机。 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.
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 class 中,如果我想 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
中,client(客户)对EspressoMachine
没有依赖,对CoffeeMachine
有间接(传递)依赖。在修改后的 CoffeeApp
中,客户端直接依赖于两个 Machine 接口。
这些依赖是抽象的,所以DIP是满足的;但它回避了一个问题,如果 CoffeeApp
向其客户端公开其依赖项,那么它的目的是什么?客户端可以直接调用这些依赖项。通过传递其依赖项,CoffeeApp
变得无用。
抱歉问了这么长的问题,还有我的英语。
我正在阅读 an article about DIP。我将在这里总结代码。
interface CoffeeMachine() {
void brewFilterCoffee();
}
interface EspressoMachine() {
void brewEspressoCoffee();
}
他们创建了两个不同的咖啡机。 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.
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 class 中,如果我想 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
中,client(客户)对EspressoMachine
没有依赖,对CoffeeMachine
有间接(传递)依赖。在修改后的 CoffeeApp
中,客户端直接依赖于两个 Machine 接口。
这些依赖是抽象的,所以DIP是满足的;但它回避了一个问题,如果 CoffeeApp
向其客户端公开其依赖项,那么它的目的是什么?客户端可以直接调用这些依赖项。通过传递其依赖项,CoffeeApp
变得无用。