9

在试图深入了解一些设计模式时,我遇到了一个让我感到困惑的示例——希望它很容易解释,但我只是想念它。

我的问题是网关适合“哪里”?作为一个附加的数据访问点,这似乎是多余的。

示例代码具有三个类 -

  1. person- 每个对象属性都有 getter 和 setter 方法
  2. personDAO- 它有数据调用来执行 CRUD。
  3. personGateway- 有getAllgetCount- 也有数据调用...???

我完全可以对数据进行 DAO 调用,并且 DAO 使用“person”类创建一个要传回的对象 - 但为什么不将getAllandgetCount放在 DAO 中?

“网关”在这个游戏中扮演什么逻辑位置?

---阅读回复后添加---

好的 - 我在搜索时显然错过了这一点 - 它确实“帮助”澄清 - 需要对模式(DAO x Gateway)进行一些澄清- 但是,它似乎非常以 Java 为中心,它实际上跳过了我希望的区别 -

我猜答案是 DAO 返回一个“对象”,而“对象”是一个单一的实体……而不是一个集合。如果你正在重新调整一个集合(如果你“应该”是有争议的)那么你会使用网关......但在任何情况下你都不应该用集合混淆 DAO......

4

3 回答 3

7

网关模式

网关封装了面向对象的领域层和面向关系的持久层之间的语义鸿沟。

定义取自这里

您示例中的网关也称为“服务”。服务层很重要,因为它在处理 Person 实体时提供了更高的抽象和更“整体”的方式。

这个“额外”层的原因是系统中连接到 Person 的其他对象。例如,假设有Car对象,每个人可能有一辆汽车。现在,当我们出售汽车时,我们应该更新“所有者”字段,此外,您还希望对所涉及的 Person 对象(卖方/买方)执行相同的操作。

为了以OO方式实现这种“级联”(不耦合对象实现)BuyCarService将更新新所有者:服务将调用CarDAOPersonDAO更新数据库中的相关字段,以便DAO不必“彼此了解”,从而将实现解耦。

希望这能让事情更清楚。

于 2013-10-28T14:34:13.580 回答
3

大多数设计模式的解释有时会变得令人困惑,因为最初它是由某人命名和解释的,但在适当的时候,其他一些类似的模式就会出现,它们的用法和解释相似,但差别很小。然后,这种细微的差异成为争论的根源:-)。关于网关模式,这是 Martin Fowler 在企业应用程序架构目录中提到的内容。我直接从这里引用

“网关 - 封装对外部系统或资源的访问的对象。”

有趣的软件很少孤立存在。即使是最纯粹的面向对象系统也经常不得不处理非对象的事物,例如关系数据库表、CICS 事务和 XML 数据结构。

当访问这样的外部资源时,您通常会获得它们的 API。但是,这些 API 自然会有些复杂,因为它们考虑了资源的性质。任何需要了解资源的人都需要了解它的 API——无论是用于关系数据库的 JDBC 和 SQL,还是用于 XML 的 W3C 或 JDOM。这不仅使软件更难理解,而且如果您在将来的某个时间点将一些数据从关系数据库转移到 XML 消息中,也会使更改变得更加困难。

答案是如此普遍,以至于几乎不值得一提。将所有特殊的 API 代码包装到一个接口看起来像普通对象的类中。其他对象通过此网关访问资源,网关将简单的方法调用转换为适当的专用 API。

于 2013-10-28T14:54:48.227 回答
1

当您想要使用复杂的 SDK、库或 API 时,网关设计模式非常有用。要使用它们,您可能需要一些较低层不必了解它们的实现,当然,这对于其他层并不重要。在这种情况下,网关设计模式是最好的解决方案。你可以使用任何 SDK 或库来实现你想要的,然后使用合约,其他项目层可以轻松地与网关一起工作。如果有一天您决定更改上述 SDK 或 API,它不会影响整个项目。您只需更改网关实现,其他层的合同将保持不变。

于 2017-06-09T06:38:32.187 回答