2014-05-09 125 views
17

請參見下面的一個DAO設計模式的組成部分:爲什麼在DAO設計模式或其他設計模式使用的界面

數據訪問對象模式或DAO模式被用於單獨的低級別的數據,從高層次的業務訪問API或操作服務。以下是數據訪問對象模式的參與者。

數據訪問對象接口 - 該接口定義了要在模型對象上執行的標準操作。

數據訪問對象具體類 - 該類實現上述接口。這個類負責從一個可以是數據庫/ xml或任何其他存儲機制的數據源獲取數據。

模型對象或值對象 - 此對象是簡單的POJO包含get/set方法來存儲使用DAO類檢索的數據。

爲什麼我們需要一個INTERFACE當我們有一個具體的類,爲什麼我們不能直接使用它?這可能是一個天真的問題,但請幫助我明確這件事情。不僅在DAO設計模式中,而且在其他設計模式中,使用INTERFACE也有點混亂。我同意這與代碼可重用性和減少耦合有關。但任何人都可以請進一步解釋一下。

回答

17

不僅在DAO設計模式,但在其他設計模式中也使用INTERFACE的 有點混亂。

接口是Java中最好用的概念之一。讓我以一個例子來解釋一下:假設你設計了一個汽車GPS裝置,它可以查看地圖並自動將汽車轉向地圖所示的方向。該GPS設備可用於諸如奔馳,菲亞特等許多汽車。對於每輛汽車,根據汽車系統的實施情況,左右轉向的機制可能不同。所以,這些函數應該由汽車製造商編寫,並且這些方法被放置在由汽車製造商根據其汽車的實施實施的接口中。該界面僅包含一組功能聲明,這些要由汽車製造商(在這種情況下)定義。得到它了?

要了解更多關於接口和爲什麼它們有用的信息,請閱讀this article

我的問題是:爲什麼當我們有一個具體的 類時,我們需要一個INTERFACE,爲什麼我們不能直接使用它。

在下面的答案中指出,許多其他好處,你可以創建不同的數據structers很多DAO類(德比分貝,巨大的堆棧等),實現DAO接口。好處是,每個類都可以存儲在DAO接口變量中,其名稱爲polymorphism

+0

非常好的例子清除了很多概念 – user3541375

+0

沒問題。我很高興,我可以幫助:)如果你認爲我的答案是有益的標記它是正確的,並將它投票,我會非常感謝:) –

+0

完成......... :) – user3541375

2

將接口與實現分開總是一個很好的設計。它爲您的代碼提供了更多抽象靈活性。 DAO接口的客戶端不需要知道它是如何實現的,而只需要知道它提供的方法。

最後,接口對於代碼的可維護性來說是一個好習慣。

就我的經驗來說,通過mock進行單元測試時,當你嘲笑的對象有一個接口時,創建模擬對象要容易得多。所以使用接口,對我來說,更容易隔離測試你的代碼。

+1

觀察:一個DAO通常不會給客戶!他們應該通過服務API輸入數據...因此,所有方面,你都沒有回答這個問題:-) – Lawrence

10

其實它的時候你只有一個執行有一個接口,沒有必要的。但也有,你沒有一個depencecy到具體類的某些情況下非常實用:

  • 測試你的服務調用DAO:你可以寫一個模擬DAO ,其行爲就像你需要它在測試中(例如模擬,有 是沒有數據庫連接,這是很難自動重現)

  • 生成一些圖層aoround你的DAO。您可以使用AOP生成 高速緩存或事務處理的DAO方法。在這種情況下,您有一個實現DAO接口的對象,但 與原始實現無關。

  • 切換DB技術。如果你從MySQL切換到DB2你只 需要編寫界面的另一個實施和切換 MySQL的DAO和DB2 DAO

因此它是一個很好的做法,有一個接口爲您的DAO和服務。

+0

關於使用DAO接口的好處。我發現它在我的構建中特別有用。根據我測試的內容,我可能會注入一個模擬器,一個連接到內存數據庫的實現,如HSQLDB或連接到測試SQL Server實例的實現。 – Steve

5

我的問題是爲什麼我們需要一個INTERFACE時,我們有一個具體的類,爲什麼我們不能直接使用它。

這是簡單的抽象。假設您使用Oracle數據庫作爲數據庫。 因此,具體類將具有訪問(CRUD操作)Oracle數據庫的邏輯。明天,如果你的許可證過期了,你不再需要使用Oracle數據庫,相反你會想使用MySQL。現在您必須重寫已經提到的具體類,並且您必須重寫服務層,因爲直接使用具體類以及它在服務層和數據訪問層之間緊密耦合的方法。人們應該始終設計一個鬆耦合的系統。

如果您要使用接口而不是具體類,那麼服務層和數據訪問層就會有一個如何交互的約定。所以服務層不會受到數據層變化的影響,因爲契約沒有改變,他們可以以舊的方式進行交互。

+0

美好而真實。然而,你違反了問題只有在它們發生時才需要解決的規則:-)我知道我知道如果我們進一步認爲這同樣適用於我們在面向對象設計中使用的許多其他方面。如果我們的Oracle許可證永不過期,並且我們永遠不會使用其他數據庫,則此接口只需要維護。我覺得我們不應該在任何地方使用它們,除非默認情況下有多個實現。當您真正需要使用IDE(IntelliJ或eclipse或...)時,您仍然可以隨時輕鬆地提取界面, – Lawrence

0

一個很好的理由是它可以很容易地編寫模擬實現來測試你的應用程序。

假設您要測試使用UserService的模塊X.當你編寫測試代碼時,你會希望它不使用真正的UserService,而是一個特殊的UserService測試版本,它返回一些預定義的測試數據。所以,在你的測試中,你傳遞你自己的IUserService模擬實現,而不是真正的UserService。

此外,它使未來更容易使用IUserService的不同實現擴展系統。也許你現在有一個UserService從數據庫中讀取有關用戶的信息。例如,將來你可能也希望有一個從LDAP獲取信息的UserService。這只是IUserService的另一個實現。由於應用程序的其餘部分只能通過接口使用UserService,所以很容易將另一個實現換成另一個。