门面设计模式用法

时间:2012-08-16 05:33:44

标签: c# design-patterns facade

在我们的应用程序(C#)中,外观被用作核心的API - 应用程序本身将使用外观来处理核心内容。知道了,这是我的问题:

  1. 假设我的一个核心对象(正面包裹)中有一个递归位?例如,Facade从树中提供“GetX”,每个节点都需要从其子树中获取GetX。这个节点应该使用Facade的'GetX'吗?
  2. 外观应该将核心对象暴露给应用程序吗?例如,用户想要构建一个树,添加节点,打印树,计算它上面的东西等。如果应用程序使用树对象或应该要求立面创建它,保存它,pring it等等。 LI>

    感谢。

3 个答案:

答案 0 :(得分:1)

  

外观是一个为更大的界面提供简化界面的对象   代码体。

因此,请保持简单。

  1. 没有。将Facade封装在自身内部。我假设你有一个私有实现来检索树,在内部使用它,只暴露返回填充对象的公共方法(见第2点)。

  2. 没有。立面应该做所有事情,否则创造它没什么意义。您可能想要创建可在facade方法中使用的DTO,但不应公开核心对象。

答案 1 :(得分:1)

关于问题1: 正如其他人所说;相反,请考虑为此操作使用单独的接口(此处interface segregation principle可能适用?),并首先通过Facade访问该接口上的操作。在递归时,可以直接再次使用内部接口。这可能会提供一些关注点分离,同时还可以在必要时更轻松地更改实现。

听起来好像递归本身就是一个实现细节,而不是外观需要了解的东西。类似地,外观是实现算法不需要知道的东西(即,不通过外观重复)。

关于问题2:如何为此定义接口?例如。 ITreeITreeNode等,并在Facade上包含操作以使用这些操作。现在让实现实现这些接口,从而提供外观所需的对象而不暴露核心对象。

答案 2 :(得分:0)

外观通常包装你的核心,并允许访问一组特定的功能。

  1. 您可能希望这样做是为了保持一致性,但如果有另一种更简单的方法来保留外观提供的抽象,那就更好了。

  2. 不会暴露任何核心代码(这会违反外观的目的)如果要添加一些功能,那么在外观中添加一个函数来调用外观中的核心功能