Design patterns 在什么场景中,您将选择Facade模式和DI?

Design patterns 在什么场景中,您将选择Facade模式和DI?,design-patterns,dependency-injection,facade,Design Patterns,Dependency Injection,Facade,请告知Facade模式和DI的实时场景。我可以用外观模式替换DI吗 该模式用于简化与(潜在)复杂子系统的交互 现实世界中的一个例子可能类似于银行系统中的PaymentFacade 在本例中,作为一名开发人员,您需要一个简单的界面,可以调用该界面进行付款——即,您只需给它一个要付款的账号、要付款的账号以及付款金额,它就可以处理付款。然而,在幕后发生的实际过程要复杂得多,它涉及到各种子系统和遗留组件。首先,它需要检查账户是否有效,然后需要检查账户余额是否足以支付款项,它必须指示支付处理系统进行处理,

请告知Facade模式和DI的实时场景。我可以用外观模式替换DI吗

该模式用于简化与(潜在)复杂子系统的交互

现实世界中的一个例子可能类似于银行系统中的PaymentFacade

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

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

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

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

paymentService.processPayment(fromAccount, toAccount, paymentAmount)
另一方面,它与立面模式不同,您不能将两者进行比较,也不能使用其中一个替代另一个


依赖倒置有助于解耦软件模块。但是,您可以在使用Facade模式的代码中使用依赖项反转。不必明确定义要使用哪种特定的facade实现,您可以将这方面的责任委托给更高级别的东西—使用Spring之类的框架,您可以指定应用程序配置中应使用哪种facade的详细信息-因此,如果您决定切换到处理付款的新方式,您的代码不必更改-它使用的特定facade实现将与其他内容交换,您的代码不会受到更改的影响。

谢谢您的回复:)。Facade模式是否违反了单一责任原则?好吧,这实际上取决于您如何实现Facade模式,但就我个人而言,我会说不-虽然Facade可以与不同的子系统通信,但它仍然处理单个(业务)操作(在我的示例中,支付)。
paymentFacade.processPayment(fromAccount, toAccount, paymentAmount);