2014-06-16 32 views
1

我將執行數據映射器模式以將數據存儲在不同的存儲/數據庫中。實施不同存儲策略的模式

實現此概念的最佳OOP模式是什麼?

例如,我有User模型類

public class User 
{ 
    private int id; 
    private String name; 
    private String surname; 

    /* getters, setters and model-level business logic */ 
} 

和適當的數據映射類

public class UserMapper 
{ 
    public User findById(int id) 
    { 
    // perform query to MySQL, Redis or another DB 
    } 

    /* other methods */ 
} 

它是通過創建多個存儲策略類,然後使用戰略模式是個好主意將它們注入DataMapper類?

public class UserMySQLStorageStrategy extends UserStorageStrategy 
{ 
    public User findById(int id) 
    { 
    // perform query to MySQL 
    } 
} 

public class UserRedisStorageStrategy extends UserStorageStrategy 
{ 
    public User findById(int id) 
    { 
    // perform query to Redis 
    } 
} 

public class UserMapper 
{ 
    protected UserStorageStrategy _storageStrategy; 

    public UserMapper(UserStorageStrategy storageStrategy) 
    { 
    this._storageStrategy = storageStrategy; 
    } 


    public User findById(int id) 
    { 
    return this._storageStrategy.findById(id); 
    } 

    /* other methods */ 
} 
+0

只是一個警告 - 在您的問題中使用「最好」可能會吸引「主要基於意見」的密切投票 – awksp

+0

@ user3580294感謝您的注意:) – zavg

+2

對我來說似乎很好。我會把它稱爲UserDAO而不是UserMapper,儘管 –

回答

1

您的策略看起來非常像映射器類本身。相反,將映射器和用戶對象變爲接口可能是有意義的,然後您的特定實現選擇如何/在哪裏存儲它們。如果您的UserMapper類執行許多與存儲無關的操作,並且即使存儲存在差異也不需要更改,則策略方法是有意義的;但是如果你所有的UserMapper類都是存儲的話,那麼一個接口和多個實現會更簡單。

+0

是的,我明白了,所以我剛剛在你回答他們之前刪除了我的評論。 :) – zavg

+0

在您描述的策略方法情況下(如果存在許多與存儲無關的操作),是否有可能將這些與存儲功能無關的不相關的內容傳遞給基類? – zavg

+0

@zavg最好使用組合/委派而不是繼承。所以,如果有很多與存儲無關的操作,那麼提供策略的初始方法會更有意義。 –

1

你不需要任何特定的OOP設計模式。你需要的是提供功能的接口。

然後你的不同的數據存儲應該實現它。然後你只需要一個爲你的程序的工作流程提供預期實例的策略。

1

我想讓UserMapper與多個實現具體類的接口首先調用接口UserDao。

我打電話給實施類User{Mysql|Redis|etc}DAO。如果你在它們之間找到任何常見的代碼,它可以被提取到一個通用的抽象基類中。

此時UserMapper類的邏輯可以被稱爲以UserDaoResolver,即選擇和在一些輸入返回的具體實施,或者如果你使用一些依賴注入框架(如Spring),您可以委派功能吧。

當前的UserMapper調用者將通過其接口使用DAO實現並通過上述方法之一獲取它。