数据映射器:我的解释是否正确?

时间:2009-12-28 18:54:26

标签: oop datamapper

我现在正在努力确认,我对Data Mapper模式的看法。所以我们走了:

A部分: Data Mapper是一个用于创建,更新和删除另一个Class的对象的类。示例:名为Cat的类和名为CatDataMapper的数据映射器。还有一个名为cats的数据库表。但它也可能是名为cats.xml的xml文件,或称为cats的硬编码数组。数据映射器的重点在于释放使用Cat类的业务逻辑思考“如何获得现有的猫”,或“如何保存猫”,“在哪里保存猫”。作为Data Mapper的用户,它看起来像一个黑盒子,具有定义良好的方法,如getCat(int id),saveCat(Cat catObject),deleteCat(Cat catObject)等。

B部分: 首先我认为如果Cat继承自CatDataMapper会很聪明,因为调用这些函数会更方便一些。例如,像catWithId(int id)这样的方法可以是静态的(类方法)并返回Cat的实例,使用 where 中的数据进行初始化。当我在代码中使用cat对象时,我可以简单地调用myCat-> save();存储它,无论数据映射器将存储它(不关心在何处以及如何,数据映射器隐藏了用户的这种复杂性)。

总之,我现在有点困惑;) 您是否认为 A部分对Data Mapper模式有效?如果我按照 B部分中的描述进行补充,那会不会很糟糕?为什么呢?

2 个答案:

答案 0 :(得分:3)

我认为您的 A部分对应于Martin Fowler

给出的数据映射器模式的定义

请注意实施语言的详细信息。在 B部分catWithId()成为cat类的静态成员可能会干扰该方法的多态行为。

在java中,JVM将根据声明的引用类型调度静态方法 试试这个:
1.使用静态方法CatDataMapper创建一个类catWithId(int id) 2.创建一个扩展Cat的类CatDataMapper,该类具有所需的业务逻辑行为
3.使用Cat的子类LoggedCat记录所有活动,包括来自CatDataMapper的活动 4.做Cat foo = new LoggedCat()
5.做Cat bar = foo.catWithId(5)

注意调用哪个方法,它应该是CatDataMapper的静态方法而不是LoggedCat的静态方法

http://faq.javaranch.com/view?OverridingVsHiding对此进行了更深入的讨论。

答案 1 :(得分:0)

我认为这是一个很好的方法。除了使用的命名约定之外,您还在这里遵循一个众所周知的数据访问模式,并允许Cat对象的用户执行CRUD操作,而无需与CatDataMapper交谈,这在我的书中总是一个优点。 / p>

如果您在java世界中,我会用它来查看Spring Container技术。