1

我现在正试图确认我对 Data Mapper 模式的看法。所以我们开始:

A 节: Data Mapper 是一个类,用于创建、更新和删除另一个类的对象。示例:一个名为 的类Cat和一个名为 的数据映射器CatDataMapper。还有一个名为cats. 但它也可以是一个名为 的 xml 文件cats.xml,或一个名为 的硬编码数组cats。Data Mapper 的全部意义在于将使用 Cat 类的业务逻辑从思考“如何获得现有的猫”或“如何拯救猫”、“在哪里拯救猫”的思考中解放出来。作为 Data Mapper 的用户,它看起来像一个带有明确定义的方法的黑盒,例如 getCat(int id)、saveCat(Cat catObject)、deleteCat(Cat catObject) 等。

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

总之,我现在有点困惑 ;) 你认为Section A对 Data Mapper 模式有效吗?如果我按照B 节中的描述额外做,那会很糟糕吗?为什么?

4

2 回答 2

3

我认为您的A 部分对应于Martin Fowler给出的 Data Mapper 模式的定义

小心你的实现语言的细节。在B 节中,作为类catWithId()的静态成员cat可能会干扰方法的多态行为。

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

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

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

于 2009-12-28T19:02:26.297 回答
0

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

如果你在 Java 世界,我建议你看看 Spring Container 技术。

于 2009-12-28T20:00:26.367 回答