Facade Pattern 是一种聚合服务,可提供多种上下文功能或服务。
来自维基百科
外观模式(或外观模式)是一种常用于面向对象编程的软件设计模式。该名称类似于建筑立面。
外观是一个对象,它为更大的代码主体(例如类库)提供简化的接口。门面可以:
话虽如此,在我的脑海中,假设您有一个主要表单是 MDI 的会计系统,因此您有多个菜单允许用户访问这些功能。
为了避免多重依赖,而不是像下面这样写:
public class MainWindow : Form {
public MainWindow(CustomerManagementPresenterFactory customerMgmt
, SupplierManagementPresenterFactory supplierMgmt
, InventoryManagementPresenterFactory inventoryMgmt
, EmployeeManagementPresenterFactory employeeMgmt
, StatementOfAccountManagementPresenterFactory statementOfAccntMgmt
, InvoicesPastDueManagementPresenterFactory pastDueInvoicesMgmt) {
// Work your dependencies here...
}
}
您清楚地看到您的 MainWindow 依赖于多个工厂(或其他任何工厂),是时候重构了。一个问题是:
- 是否有太多的依赖项传递给我的
MainWindow 构造函数?
答案是肯定的,我有。尽管如此,我的MainWindow 确实需要所有这些依赖项才能满足其要求。
有人可能会说Past due invoices、Statement of accounts 和Customer management 功能应仅聚合到一项服务中。 外观来了。
public class CustomerManagement {
public CustomerManagement(CustomerManagementPresenterFactory customerMgmt
, StatementOfAccountManagementPresenterFactory statementOfAccntMgmt
, InvoicesPastDueManagementPresenterFactory pastDueInvoicesMgmt) {
// Work your dependencies here...
}
}
所以现在MainWindow 构造函数可以如下所示。
public class MainWindow : Form {
public MainWindow(CustomerManagement customerMgmt
, SupplierManagementPresenterFactory supplierMgmt
, InventoryManagementPresenterFactory inventoryMgmt
, EmployeeManagementPresenterFactory employeeMgmt) {
// Work your dependencies here...
}
}
然后,根据您的业务领域,SupplierManagement 可以与您的InventoryManagement 密切相关,这样就可以像这样进行另一个聚合。
public class InventoryManagement {
public InventoryManagement(InventoryManagementPresenterFactory inventoryMgmt
, SupplierManagementPresenterFactory supplierMgmt) {
// Work your dependencies here...
}
}
以便您可以进一步重构为:
public class MainWindow : Form {
public MainWindow(CustomerManagement customerMgmt
, InventoryManagement inventoryMgmt
, EmployeeManagementPresenterFactory employeeMgmt) {
// Work your dependencies here...
}
}
现在,正如您所看到的,要了解MainWindow 可能会做什么来实现其目的要简单得多。背后的想法是将对您的业务领域有意义的东西组合在一起。在另一种情况下,可能更喜欢将CustomerManagement、SupplierManagement 和EmployeeManagement 组合在一起,因为它们具有与Name、Address、Phone Number、Email 等类似的信息要共享. 这主要是根据你的需要。最后,外观的作用还是一样的,将相似的业务特征组合在一起,添加抽象层并降低复杂性。
Mark Seemann 的一篇非常有趣的文章是Refactoring to Aggregate Services。
有关Design Patterns 和Dependency Injection 的更多信息,我推荐Seemann 先生的书:Dependency Injection in .NET。虽然标题写着.NET,但任何想了解Dependency Injection 和Design Patterns 的人都应该阅读它以加深对主题的理解并提高一项技能。即使您不是来自 .NET,该示例也很容易理解。
关于外观模式的其他有趣的 Q/A 问题
免责声明
我知道您的问题已标记为 Java,并且我发布了 C# 代码。这是为了快速回答我的想法。我认为虽然我的示例是 C#,但您可能很容易理解为外观显示的示例的关键点,因为它们很简单,恕我直言