Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 何时使用网关设计模式_Oop_Design Patterns - Fatal编程技术网

Oop 何时使用网关设计模式

Oop 何时使用网关设计模式,oop,design-patterns,Oop,Design Patterns,当我试图进入一些设计模式时,我遇到了一个让我困惑的例子——希望它是一些容易解释的东西,而我只是错过了它 我的问题是“网关在哪里”适合这个?作为一个附加的数据访问点,它似乎是多余的 示例代码有三个类- person-它对每个对象属性都有getter和setter方法 personDAO-具有执行CRUD的数据调用 personGateway-其中有getAll和getCount-这些也是数据调用 我完全可以对数据进行DAO调用,DAO使用“person”类创建一个要传递回去的对象——但是为什么不将

当我试图进入一些设计模式时,我遇到了一个让我困惑的例子——希望它是一些容易解释的东西,而我只是错过了它

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

示例代码有三个类-

  • person
    -它对每个对象属性都有getter和setter方法
  • personDAO
    -具有执行CRUD的数据调用
  • personGateway
    -其中有
    getAll
    getCount
    -这些也是数据调用
  • 我完全可以对数据进行DAO调用,DAO使用“person”类创建一个要传递回去的对象——但是为什么不将
    getAll
    getCount
    放在DAO中呢

    “网关”在这个游戏中的逻辑位置是什么

    ---阅读后补充回答---

    好的-我在搜索时显然错过了这个-它确实“有助于”澄清- -然而,它看起来非常以java为中心,实际上它跳过了我所希望的区别-


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

    网关模式

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

    定义取自

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

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

    为了以面向对象的方式实现这种“级联”(不耦合对象实现)
    BuyCarService
    将更新新所有者:该服务将调用
    CarDAO
    PersonDAO
    ,以更新数据库中的相关字段,使dao不必“知道”它们相互关联,从而使实现解耦


    希望这能让事情变得更清楚。

    大多数设计模式的解释在某个时候变得混乱,因为最初它是由某人命名和解释的,但随着时间的推移,一些其他类似的模式出现了,它们有着相似的用法和解释,但差别很小。这种微妙的差异于是成为争论的根源:-)。关于网关模式,以下是Martin Fowler在企业应用程序体系结构目录中提到的内容

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

    有趣的软件很少孤立存在。即使是最纯洁的 面向对象系统通常必须处理与之无关的事情 对象,例如关系数据库表、CICS事务和 XML数据结构

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

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


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

    有趣的是,这里很好地讨论了这一点的可能重复-它使事情变得更为混乱-仅仅是因为示例中有一个“personService”-我没有包括它,因为我想先掌握“gateway”-很明显,“service”(在本例中)是对DAO或gateway中的任何方法的远程调用(再次-在本例中)所以,通过说网关就是服务——这确实混淆了问题,但我会通过阅读上面的所有建议并提炼出所有信息——thx来尝试使其符合要求。@jpmyob根据我阅读的不同来源,GW模式和服务具有相同的目的。我在答案中添加了GW的定义。可能是GW的其他例子虽然不是一项服务,但它仍然被用来封装(隐藏)“幕后”发生的事情。即使你遇到一个GW看起来完全冗余的例子,拥有它仍然是一个好主意,因为产品的本质是开发和变得更复杂,我们应该计划