我正在尝试温习我的设计模式技能,我很好奇这些模式之间有什么区别?所有这些看起来都是同一件事 - 封装特定实体的数据库逻辑,因此调用代码不了解底层持久层。根据我的简短研究,它们通常都实现标准 CRUD 方法并抽象出特定于数据库的细节。
除了命名约定(例如 CustomerMapper、CustomerDAO、CustomerGateway 和 CustomerRepository)之外,还有什么区别(如果有)?如果有差异,您什么时候会选择其中之一?
过去我会编写类似于以下的代码(自然地简化 - 我通常不会使用公共属性):
public class Customer
{
public long ID;
public string FirstName;
public string LastName;
public string CompanyName;
}
public interface ICustomerGateway
{
IList<Customer> GetAll();
Customer GetCustomerByID(long id);
bool AddNewCustomer(Customer customer);
bool UpdateCustomer(Customer customer);
bool DeleteCustomer(long id);
}
并有一个CustomerGateway
为所有方法实现特定数据库逻辑的类。有时我不会使用接口并将 CustomerGateway 上的所有方法设为静态(我知道,我知道,这使其难以测试),因此我可以这样调用它:
Customer cust = CustomerGateway.GetCustomerByID(42);
对于数据映射器和存储库模式来说,这似乎是相同的原理; DAO 模式(我认为这与网关是同一回事?)似乎也鼓励特定于数据库的网关。
我错过了什么吗?使用 3-4 种不同的方法来做同一件事似乎有点奇怪。
您的示例条款; DataMapper、DAO、DataTableGateway 和 Repository 都有相似的目的(当我使用其中之一时,我希望返回一个 Customer 对象),但意图/含义和结果实现不同。
A 存储库 “除了具有更精细的查询功能外,其行为就像一个集合” [埃文斯,领域驱动设计 https://web.archive.org/web/20210507021346/http://domaindrivendesign.org/books/evans_2003] 并可被视为“内存外观中的对象” (存储库讨论 https://web.archive.org/web/20210126033021/http://geekswithblogs.net/gyoung/archive/2006/05/03/77171.aspx)
A 数据映射器 “在对象和数据库之间移动数据,同时保持它们彼此独立以及映射器本身独立” (福勒、PoEAA、制图员 https://martinfowler.com/eaaCatalog/dataMapper.html)
A 表数据网关 is “一个数据库表的网关(封装对外部系统或资源的访问的对象)。一个实例处理表中的所有行" (福勒、PoEAA、TableDataGateway https://martinfowler.com/eaaCatalog/tableDataGateway.html)
A DAO “将数据资源的客户端接口与其数据访问机制分开/将特定数据资源的访问 API 调整为通用客户端接口”允许“数据访问机制的更改独立于使用数据的代码” (太阳蓝图 https://www.oracle.com/java/technologies/data-access-object.html)
存储库看起来非常通用,没有暴露数据库交互的概念。
DAO 提供了一个接口,允许使用不同的底层数据库实现。
TableDataGateway 是特定于单个表的薄包装器。
DataMapper 充当中介,使模型对象能够独立于数据库表示(随着时间的推移)而发展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)