2009-12-28 43 views
1

我想确认现在,我对数据映射器模式的看法。所以在这里我们去:数据映射器:我的解释是否正确?

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

B节: 首先我想如果猫从CatDataMapper继承,因为调用这些函数则是更方便一点这将是聪明的。例如,像catWithId(int id)这样的方法可以是静态的(类方法),并返回一个Cat的实例,用的任何地方的数据初始化。当我在我的代码中使用一个猫对象时,我可以简单地调用myCat-> save(); Data Mapper将存储它(不关心在哪里以及如何操作,Data Mapper将这种复杂性从用户身上隐藏起来)。

总之,我现在有点困惑;) 您认为A部分是适用于数据映射器模式吗?如果我想按照B部分中所述那样进行,那会不好吗?为什么?

回答

3

我觉得您部分对应于数据映射模式的definiton通过Martin Fowler

给出小心你实现语言的细节。 B部分具有catWithId()是类的静态成员可能会干扰该方法的多态行为。

在java中,JVM将派发一个基于声明的引用类型的静态方法。
尝试了这一点:
1.创建一个类CatDataMapper与静态方法catWithId(int id)
2.创建Cat延伸CatDataMapper一类具有所需业务逻辑行为
3.子类CatLoggedCat该记录所有活动,包括从CatDataMapper
4.活动做Cat foo = new LoggedCat()
5.做Cat bar = foo.catWithId(5)

注意哪些方法被调用,它应该是静态方法CatDataMapper不是静态方法LoggedCat

http://faq.javaranch.com/view?OverridingVsHiding给出了更深入的讨论。

+0

谢谢。请你能解释一下你最后一句话的意思吗“在B部分有catWithId()是猫类的静态成员可能会干扰该方法的多态行为。”?当cat类继承这个静态方法以创建一个基于给定id的初始化的新猫对象时,会出现什么问题? – openfrog 2009-12-28 19:11:32

+0

如果你正在用Java实现,你只需要知道这个边界情况。 'catWithId()'方法对于这个“gotcha”行为可能是安全的。其他需要多态行为的方法会产生问题。不要忘记在junit测试中使用压倒一切的方法! – Andrew 2009-12-28 20:07:32

0

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

如果你是在java世界,我会为这个看看Spring Container技术。