【问题标题】:What is the advantage of using the facade along with MVC? [closed]将外观与 MVC 一起使用有什么好处? [关闭]
【发布时间】:2014-08-20 19:41:56
【问题描述】:

阅读有关facade,但不太了解使用的优势,主要使用MVC。有人可以帮我理解吗?一些更实际的例子? 原谅我的无知!

【问题讨论】:

  • google“外观设计模式示例”并开始阅读
  • 如我所说,看了几篇文章,也看到了一些例子,但是不明白使用门面的效果!也就是说,没有意识到需要使用门面。
  • 我认为 MVC 与这个问题完全无关......
  • 您要求一些更实际的例子。上面google搜索返回的实际例子很多。
  • DavidPostill,我明白,但正如我所提到的,我想了解使用外观的重要性,尤其是使用 MVC。在我看到的所有例子中,我都不清楚。谢谢!

标签: design-patterns language-agnostic facade


【解决方案1】:

Facade Pattern 是一种聚合服务,可提供多种上下文功能或服务。

来自维基百科

外观模式(或外观模式)是一种常用于面向对象编程的软件设计模式。该名称类似于建筑立面。

外观是一个对象,它为更大的代码主体(例如类库)提供简化的接口。门面可以:

  • 使软件库更易于使用、理解和测试,因为外观为常见任务提供了方便的方法;

  • 出于同样的原因,使库更具可读性;

  • 减少外部代码对库内部工作的依赖,因为大多数代码都使用外观,从而使开发系统具有更大的灵活性; 用一个设计良好的 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...
    }
}

您清楚地看到您的 MainWindow 依赖于多个工厂(或其他任何工厂),是时候重构了。一个问题是:

  • 是否有太多的依赖项传递给我的MainWindow 构造函数?

答案是肯定的,我有。尽管如此,我的MainWindow 确实需要所有这些依赖项才能满足其要求。

  • 如何重构以减少依赖项的数量?

有人可能会说Past due invoicesStatement of accountsCustomer 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 可能会做什么来实现其目的要简单得多。背后的想法是将对您的业务领域有意义的东西组合在一起。在另一种情况下,可能更喜欢将CustomerManagementSupplierManagementEmployeeManagement 组合在一起,因为它们具有与NameAddressPhone NumberEmail 等类似的信息要共享. 这主要是根据你的需要。最后,外观的作用还是一样的,将相似的业务特征组合在一起,添加抽象层并降低复杂性。

Mark Seemann 的一篇非常有趣的文章是Refactoring to Aggregate Services

有关Design PatternsDependency Injection 的更多信息,我推荐Seemann 先生的书:Dependency Injection in .NET。虽然标题写着.NET,但任何想了解Dependency InjectionDesign Patterns 的人都应该阅读它以加深对主题的理解并提高一项技能。即使您不是来自 .NET,该示例也很容易理解。

关于外观模式的其他有趣的 Q/A 问题

免责声明

我知道您的问题已标记为 Java,并且我发布了 C# 代码。这是为了快速回答我的想法。我认为虽然我的示例是 C#,但您可能很容易理解为外观显示的示例的关键点,因为它们很简单,恕我直言

【讨论】:

  • 感谢您的解释和示例。现在很清楚如何以及在何处使用外观了!
  • 这是我见过的最好的解释,我已经阅读了几个小时。如果你有博客,请告诉我,我会关注
【解决方案2】:

外观旨在包装复杂功能,其主要目标是隐藏底层系统的复杂性。您可以将 Facade 视为包装复杂功能并提供更简单的交互方法的层。

它为客户端提供了一个接口,客户端可以使用该接口访问系统。这种类型的设计模式属于结构模式,因为这种模式向现有系统添加了一个接口以隐藏其复杂性。

【讨论】:

  • Tushar 据我了解,外观仅用于调用更简单的方法。是吗?如果门面也会呈现一些业务规则,或者它在另一个层?
【解决方案3】:

当涉及到计算机设计时,MVC 更像是一种通用的思维方式。 MVC 可以用在 Web 开发或桌面应用程序的对话中 但是对于 EJB 或门面,它确实不那么通用而更具体。 “它曾经处理所有事务管理器和持久性管理器的交互。” 您将使用类似 JSF 作为视图和 JPA 或 Hibernate 的东西。 使用 EJB 还可以提供更多预制代码选项。

有时我认为某些主题之间的差异,例如外观和 MVC 并不总是黑白的或那么明显。

【讨论】:

  • Rika 真的对我来说,一开始是很混乱的。 Will Marcouiller 和 Tushar Gupta 给出的例子是理解如何以及何时使用立面工程的关键。尤其是威尔引用 Marcouiller 的例子!很棒且易于理解!
猜你喜欢
  • 2019-05-02
  • 2012-03-16
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
相关资源
最近更新 更多