2017-02-22 45 views
0

我已經參與了一個Java項目,該項目從不同的支付代理獲取支付信息,處理它並存儲到我們的結算系統(數據庫)中。在這種情況下創建通用的DAO還是將它分離到較小的DAO會更好?

由於我們有不同的代理商,因此有不同的付款協議,因此我們有時會使用類似的付款方式,有時也會使用不同的付款方式。一些協議需要添加,檢查和刪除支付,一些需要檢查支付狀態並添加支付,另一些協議需要實現非常特定的協議方法。所以很難設計DAO接口的層次結構。

最終我們創建了一個通用的DAO接口,該接口支持所有可能的付款方法以及每個付款代理的此DAO接口的一個實現。如果支付代理不支持特定的方法實現,則拋出UnsupportedOperationException()。例如:

piblic interface Dao { 
     void addPayment(Payment p); 
     void removePayment(Payment p); 
     ... 
     String getVersion(); 
    } 

    public PaymentAgentDao implements Dao { 
     public void addPayment(Payment p) {...} 
     public void removePayment(Payment p) {...} 
     public String getVersion() { 
      throw new UnsupportedOperationException(); 
     } 
    } 

    public AnotherAgentDao implements Dao { 
     public void addPayment(Payment p) {...} 
     public void removePayment(Payment p) { 
      throw new UnsupportedOperationException(); 
     } 
     public String getVersion() {...} 
    } 

我在想,這是處理這種情況的最好方法嗎?另一種方法是創建特定的接口(我在SOLID中的原則),但由於不可能創建接口層次結構,所以會存在代碼重複性。沒有支持所有付款代理的基本方法。處理這種情況的最佳做法是什麼?

+1

曾聽說過[_generic types_](https://docs.oracle.com/javase/tutorial/java/generics/types.html)?除此之外......基於意見! – Seelenvirtuose

+0

@Seelenvirtuose它對此有何幫助? – GlaIZier

+1

爲什麼不使用某種類型的定位器,基於帶有單個方法的接口,如'handlePayment',並且如果您有辦法在接收付款時找到解決方案,則可以使用基於代理的不同實現? – DamCx

回答

1

我認爲這是正確的,但它可以稍微改善。

  • 我認爲接口的名稱更好是代理甚至PaymentAgent,因爲那是系統中對象的類型。我堅持認爲你對所有這些人都有單一的類型,但是對象將與人類不同 - 所有相似,但做同樣的事情有點不同。所以,一個代理只是做支付,另一個檢查的東西,第三個可以做黑魔法...

  • 除了接口我會創建一個抽象類PaymentAgentAdapter與所有方法具體,但什麼都不做。這樣,這些代理的所有具體對象就只需要實現他們實際需要的方法。這有助於縮短代碼。

  • 我會考慮拋出UnsupportedOperationException帶來的不便,甚至是不正確的,因爲它需要嘗試捕獲客戶端的Agent的所有方法。

相關問題