2010-04-02 61 views
1

我有兩個網站具有幾乎相同的數據庫架構。唯一的區別是一個網站中的一些表格有另外一個或兩個字段,反之亦然。適用於幾乎相似對象的優秀設計模式

我想要相同的數據庫訪問層類來操縱這兩個網站。

什麼可以是一個很好的設計模式,可以用來處理這種微小的差異。

例如,我有一個方法createAccount(Account account)在我的DAO類,但實施將是一個網站和網站B.

回答

1

之間略有不同。如果對象的實現也將是幾乎相同的,我會建議使用抽象基類。通過繼承擴展類,並確保不知道擴展字段的函數需要基類而不是派生類。

class MercedesBenzC300 : Car 
{ 
    int brake(); 
    void TurnOnRadio(); 
} 

class MercedesBenzC300Business : MercedesBenzC300 
{ 
    int EnableCruiseControl(); 
} 

因此,在這個例子中,我們有兩輛車,其幾乎是完全一樣的,但是,一個是商業版,因此​​具有巡航CONTROLE。所有不與巡航控制相互作用的功能也可以將其視爲普通汽車。只有那些應該使用巡航控制的人現在應該得到派生類。

0

很少有細節說一些具體的東西,但我會嘗試。它取決於形勢的複雜性,但你可以很樂意與簡單的參數化是切換上的功能/關:

class AccountRepository: 
    def constructor(have_feature_a, have_feature_b, etc): 
     # ... 

    def create_account(account): 
     if have_feature_a: 
      # do something special 
     # do common operations 
     if have_feature_b: 
      # do another special thing 

這工作得很好,如果你有幾個這樣的特點,他們在幾行代碼做的非常小的東西(可表示)。如果其中一些功能很重,可以將它們封裝在具有已知接口的獨立類中。這就是所謂的策略模式。然後這個策略被注入AccountRepository作爲依賴。這被稱爲DI或依賴注入

class AccountRepository: 
    def constructor(have_feature_a, feature_b_worker, etc): 
     # ... 

    def create_account(account): 
     if have_feature_a: 
      # do something special 
     # do common operations 
     if feature_b_worker != null: 
      # line bellow runs heavy code encapsulated in strategy 
      feature_b_worker.do_work(account) 

現在,你甚至可以有多個FeatureB實現,並使用其中任何一個針對不同的情況。例如。一個用於測試,一個用於生產。