【问题标题】:Is it OK to call Facade for internal use?可以调用 Facade 供内部使用吗?
【发布时间】:2014-01-19 16:55:29
【问题描述】:

我最近看到了一个带有 Facade 模式的 EJB 代码,它提供了一些在表示层 (JSF) 中使用的方法。但是在业务逻辑的某些部分,Facade 的方法被调用并被使用。

这对我来说有点奇怪,因为我认为 Facade 应该服务于外部世界而不是内部功能。我是对的还是我偏执了?

这是一个粗略的(愚蠢)图表来说明情况:

【问题讨论】:

  • 我认为你是对的。如果该函数应该从业务逻辑中使用,那么它应该只是将其委托给其他实体。
  • 在 GoF 术语中,内部类对 Facade 一无所知。如果内部类使用 Facade,则它成为 Mediator。
  • @nikita,谢谢。那是一个很好的。
  • @nikita 不正确 - 外观定义为“为子系统中的一组接口提供统一接口”。在原始的 GoF 意义上。它对内部或外部没有限制,外观在实现方面与中介完全不同。
  • @ErmiyaEskandary 没有。证明 - books.google.ru/books/…。经典书籍 - “可重用面向对象软件的设计模式元素”出版日期 1994 (google.ru/books/edition/Design_Patterns/…)。同样在调解员-books.google.ru/books/…

标签: java design-patterns facade


【解决方案1】:

是的,你是对的!外观通过向其客户隐藏复杂性和随意性来提供复杂事物的接口。客户端可以JSF查看页面、另一个bean或服务。只要你相应地使用它就没有技术问题!

但一般来说,如果你以传统的方式进行分层,它不应该像你描述的那样。

【讨论】:

  • 感谢您的贡献。虽然我接受了 Jeroen 的回答,但我会给你一些赞成票,因为你的回答和他的一样好。
  • 可以创建额外的 Facades 类来防止单个外观有许多职责。这可以避免不相关的特征聚集在一个复杂的结构中。正因为如此,我认为门面可以被客户端和其他门面使用。
【解决方案2】:

不,我认为你不应该。立面用于调节层之间的界面;它也不应该在图层内部使用。

而且它也不应该是必要的。我假设getProductById 将调用委托给某种获取Product 的存储库。您可以使用依赖注入在适当的类中注入您的存储库。在我刚刚绘制的小型 UML 示例中(已经有一段时间了,如果某些连接不正确,请见谅)我演示了这种方法。

现在Report 类可以访问ProductRepository 并且可以从那里获取数据,而不是通过 Façade 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多