2009-12-28 84 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技術。