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
-这些也是数据调用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看起来完全冗余的例子,拥有它仍然是一个好主意,因为产品的本质是开发和变得更复杂,我们应该计划