在什么场景下,你会选择Facade模式和DI?

In what scenario, you will choose Facade pattern and DI?

请说说Facade模式和DI的实时场景。我可以用 Facade Pattern 替换 DI 吗?

Facade 模式用于简化与(可能)复杂子系统的交互。

真实世界的例子可能类似于银行系统中的 PaymentFacade。

对于这个例子,作为开发人员,您需要一个简单的界面,您可以调用它来进行支付 - 即您只需给它一个要支付的帐号,要支付的帐号,以及支付金额和它处理付款。然而,幕后发生的实际过程要复杂得多,它涉及各种子系统和遗留组件。首先,它需要检查账户是否有效,然后它需要检查账户余额是否足以支付支付,它必须指示支付处理系统进行处理等。

所以处理付款背后的实际代码可能如下所示:

accountService.validateAccountNumber(toAccount);
int balance = accountService.getBalance(fromAccount);

if (balance < paymentAmount) {
    raiseError("Insufficient funds");
}

paymentService.processPayment(fromAccount, toAccount, paymentAmount)

你的第一个选择是将这段代码复制到整个系统,希望每一个写支付处理代码的开发者记得打到所有相关的子系统。或者,您可以创建一个 PaymentFacade 来封装所有这些逻辑并隐藏其背后的复杂性 - 这样您就可以在外观上调用一个方法来处理付款。

paymentFacade.processPayment(fromAccount, toAccount, paymentAmount);
另一方面,

Dependency inversion 与 Facade 模式不同,您不能比较两者或用一个代替另一个。

依赖倒置有助于解耦软件模块。但是,您可以在使用外观模式的代码中使用依赖倒置。无需显式定义要使用的特定外观实现,您可以将其责任委托给更高级别的某些东西 - 使用像 Spring 这样的框架,您可以指定应在应用程序的应用程序中使用哪个外观的详细信息配置 - 所以如果你决定切换到一种新的处理付款方式,你的代码不必更改 - 它使用的特定外观实现将被其他东西替换掉,而你的代码不会受到影响变化。