“控制器”是Facade模式的一个例子吗?

时间:2016-06-14 09:13:02

标签: design-patterns model-view-controller controller object-oriented-analysis facade

我的问题很简单。今天,前端和后端都有很多框架,它们实现了MVC(模型 - 视图 - 控制)架构。

MVC中的'控制器'是外观设计模式的一个示例吗?

2 个答案:

答案 0 :(得分:7)

好的,让我先说一下:我不会想到这些条款" MVC"也不是" Facade"定义得足以使这个问题简明扼要地回答。有许多不同的口味"每个MVC都有不同的属性。所以说清楚"是"或"不"我认为有点自以为是,但也没有那么有用。

一般答案

我不相信Facade和Controller是一回事。

如果你看一下Gang-Of-Four设计模式,我们就不能通过代码结构来确定模式的含义或实现。这意味着,您无法查看大多数代码并说出"这显然是一个X模式"。

一个简单的示例是Facade和Adapter。从代码的角度来看,两者都是相同的,所以差异不是技术性的,而是你如何使用它。您构建了一个适配器,通过定义的API(接口)将一个复杂系统连接到另一个系统。当您为同一目的创建新界面时,您可以构建一个外观。这意味着区别在于新构建的层是满足现有接口(适配器)还是创建新接口(Facade)。一旦写完,就没有区别了。

我们可以对Decorator和Proxy说同样的话。事实上,我们可以为很多人这样做。我在演讲的前半部分Beyond Design Patterns基于此Blog Post by the same name来讨论这个事实。

为什么重要

最终,我们需要查看为什么编写代码以查看控制器和外观是否相同(或相似)。

为什么要编写外观:因为您希望提供对复杂系统的更简单访问,通常是针对特定用例。来自Sourcemaking:

  

为子系统中的一组接口提供统一接口。 Facade定义了一个更高级别的界面,使子系统更易于使用。

为什么要编写一个控制器:因为你想为一个"外部用户"提供一个特定的功能。控制器将请求路由到您的"模型"并与View进行交互。

相同(将简单界面路由到幕后更复杂的集合)。应用程序中的控制器就像Facade一样,它充当了一个"网关"针对特定用例的更复杂的应用程序。

Nuance

我认为这个问题非常有趣,因为它让我们思考为什么远不止于什么。如果您将控制器视为可以从多个位置调用的通用抽象(在一种情况下从HTTP调用,在另一种情况下从CLI调用),那么它确实开始像Facade一样看起来像 LOT

但是,如果您的控制器倾向于在单个上下文中使用,那么它们就像Facades一样停止查看,而是开始看起来就像通用代码一样。

这里的细微差别非常重要。事实上,对我来说,只是提出问题并思考细微差别 FAR 比任何答案都重要。

答案 1 :(得分:1)

正如@ircmaxell指出的那样,在回答一个定义不明确的问题时会遇到麻烦。

为了清楚起见,我会使用Fowler's definition of an MVC Controller(强调我的):

  

MVC的演示部分由剩下的两个元素组成:view和 controller 控制器的作业是获取用户的输入并弄清楚如何处理它。

     

此时我要强调的是,不仅有一个视图和控制器,您对屏幕的每个元素都有一个view- controller 对,每个控件和屏幕作为一个整体。

我将使用有关Facade的 intent 的文本(来自我的GoF副本):

  

意图

     

为子系统中的一组接口提供统一接口。 Facade定义了一个更高级别的界面,使子系统更易于使用。

根据这些定义,它们并不是一回事。

现在,值得一提的是 GRASP Controller (不是MVC)通常是应用程序或域层的外观:

  

名称:控制器   问题:UI层之外的第一个对象是否接收并协调("控制")系统操作?   解决方案:将责任分配给表示以下选项之一的对象:

     
      
  • 表示整个“系统”,“根对象”,软件在其中运行的设备,或主要子系统(这些都是外观控制器的变体)。
  •   
  • 表示发生系统操作的用例场景(用例或会话控制器)
  •