Fab*_*ura 2 language-agnostic design-patterns facade
阅读有关外观,但不太了解使用的优势,主要是使用MVC.有人可以帮我理解吗?一些更实用的例子?请原谅我的无知!
该门面模式是一个聚合服务,它提供了多种情景的功能或服务.
来自维基百科
外观模式(或外观模式)是一种常用于面向对象编程的软件设计模式.该名称类似于建筑立面.
外观是一个对象,它为更大的代码体提供了简化的接口,例如类库.门面可以:
使软件库更易于使用,理解和测试,因为外观具有便捷的常见任务方法;
出于同样的原因,使库更具可读性;
减少外部代码对库内部工作的依赖性,因为大多数代码使用外观,从而允许更灵活地开发系统; 使用一个设计良好的API(根据任务需要)包装设计不佳的API集合.
这就是说,我说你有一个会计系统,其主要形式是MDI,因此你可以在这里和那里有多个菜单,允许用户访问这些功能.
为了避免多个依赖项,而不是写下面的内容:
public class MainWindow : Form {
public MainWindow(CustomerManagementPresenterFactory customerMgmt
, SupplierManagementPresenterFactory supplierMgmt
, InventoryManagementPresenterFactory inventoryMgmt
, EmployeeManagementPresenterFactory employeeMgmt
, StatementOfAccountManagementPresenterFactory statementOfAccntMgmt
, InvoicesPastDueManagementPresenterFactory pastDueInvoicesMgmt) {
// Work your dependencies here...
}
}
Run Code Online (Sandbox Code Playgroud)
如果您清楚地看到您的MainWindow依赖于多个工厂(或任何其他工厂),那么现在是重构的时候了.一个问题是:
MainWindow构造函数?答案是肯定的,我有.尽管如此,我MainWindow确实需要所有这些依赖项才能满足其要求.
有人可能会说Past due invoices,这些Statement of accounts和Customer management功能应该只汇总到一个服务中.Facade来了.
public class CustomerManagement {
public CustomerManagement(CustomerManagementPresenterFactory customerMgmt
, StatementOfAccountManagementPresenterFactory statementOfAccntMgmt
, InvoicesPastDueManagementPresenterFactory pastDueInvoicesMgmt) {
// Work your dependencies here...
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在MainWindow构造函数可以如下所示.
public class MainWindow : Form {
public MainWindow(CustomerManagement customerMgmt
, SupplierManagementPresenterFactory supplierMgmt
, InventoryManagementPresenterFactory inventoryMgmt
, EmployeeManagementPresenterFactory employeeMgmt) {
// Work your dependencies here...
}
}
Run Code Online (Sandbox Code Playgroud)
然后,根据您的业务领域,SupplierManagement可能与您的密切关联InventoryManagement,以便可以像这样完成另一个聚合.
public class InventoryManagement {
public InventoryManagement(InventoryManagementPresenterFactory inventoryMgmt
, SupplierManagementPresenterFactory supplierMgmt) {
// Work your dependencies here...
}
}
Run Code Online (Sandbox Code Playgroud)
这样你就可以进一步重构:
public class MainWindow : Form {
public MainWindow(CustomerManagement customerMgmt
, InventoryManagement inventoryMgmt
, EmployeeManagementPresenterFactory employeeMgmt) {
// Work your dependencies here...
}
}
Run Code Online (Sandbox Code Playgroud)
现在,正如您所看到的,理解MainWindow为实现其目的可能做些什么更为简单.背后的想法是将对您的业务领域有意义的组合在一起.在另一种情况下,人们可能会向者优先组在一起CustomerManagement,SupplierManagement和EmployeeManagement他们有类似的信息共享为Name,Address,Phone Number,Email,等,这主要是根据您的需求.最后,外观的作用仍然相同,将类似的业务功能组合在一起,以添加抽象层并降低复杂性.
Mark Seemann关于该主题的一篇非常有趣的文章是重构聚合服务.
有关详细信息Design Patterns,并Dependency Injection,我建议西曼先生的书:在.NET依赖注入.虽然标题表明.NET,任何人都想要了解Dependency Injection并且Design Patterns应该阅读它以增加对主题的理解并提高一种技能.即使您不是来自.NET,该示例也很容易理解.
关于外墙图案的其他有趣的Q/A.
放弃
我知道您的问题已被标记
Java,我发布了C#代码.这是为了快速回答我的问题.我认为虽然我的样本是C#,你可能很容易理解为正面显示的例子的关键点,因为它们很简单,恕我直言