2014-03-27 74 views
1

我的業務場景如下:類設計 - 界面還是抽象類?

我們可以使用多種支付系統(PS1,PS2,PS3 ...)進行支付。常用功能是 - ProcessPayment。該付款基於數據庫中的數據。

我可以使用什麼設計?

1)使用ProcessPayment方法和PaymentSystemBase基類創建IPaymentSystem接口,該類可與數據庫內容(如連接,檢索數據等)一起工作。創建實現IPaymentSystem接口的特定類PS1,PS2,PS3 ...,並從PaymentSystemBase基類派生以使用常見的數據庫內容。

2)創建包含所有ProcessPayment方法和數據庫內容的抽象基類。

3)別的東西。

interface IPaymentSystem 
{ 
    void ProcessPayment(); 
} 

public class PaymentSystemBase 
{ 
    public PaymentSystemBase() 
    { 
     CheckInputParameters(); 
     CreateDatabaseConnection(); 
    } 

    protected void CheckInputParameters() {} 
    protected void CreateDatabaseConnection() {} 
} 

public class PS1 : PaymentSystemBase, IPaymentSystem 
{ 
    public void ProcessPayment() 
    { 
     Console.WriteLine("Process PS1..."); 
    } 
} 

public class PS2 : PaymentSystemBase, IPaymentSystem 
{ 
    public void ProcessPayment() 
    { 
     Console.WriteLine("Process PS2..."); 
    } 
} 

回答

0

你寧願創建一個抽象類爲了把所有的數據庫的東西; 如果你想聲明的接口這是抽象類應該實現它:

// Not necessary 
public IPaymentable { 
    void ProcessPayment(); 
} 

// Interface should be implemented here 
public abstract class PaymentSystemBase: IPaymentable { 
    ... 
    private IDatabaseConnection connectToDatabase() {...} 
    ... 
    protected void loadFromDatabase() {...} 
    protected void saveToDatabase() {...} 
    ... 
    protected PaymentSystemBase() {...} 

    public abstract void ProcessPayment(); 
} 

// A concrete class should only override ProcessPayment() method 
public class PS1: PaymentSystemBase { 
    public override void ProcessPayment() {...} 
} 

// A concrete class should only override ProcessPayment() method 
public class PS2: PaymentSystemBase { 
    public override void ProcessPayment() {...} 
} 
0

我會用第一種方法,Interface,Abstract類來實現一般方法和具體類。

在我的觀點中,抽象類永遠不會替代接口,所以我會放棄第二種方法。

其他解決方案可以依賴於您的業務,需求,...

,可能是錯的唯一的事情就是你的類,都可能觸犯單一責任,因爲它必須處理支付類的東西,也創建數據庫連接。對我來說,數據庫連接應該在另一個地方。

Regards

0

在這種情況下,我會建議你去接口。只涉及一種方法。您爲各種付款類型(PS1,PS2,PS3 ...)提供自己的實施。

如果您有更多的方法和變量,這些方法和變量對於ProcessPayment來說是很常見的,那麼您可以考慮抽象類,其中至少有些方法行爲不會被更改。但是請記住,當您使用Abstract類時,您正在失去類繼承。

如果只涉及一種方法,則使用接口。

+0

是的,這裏只有1方法。但是,數據庫的東西呢?我應該按照我的計劃爲其保留單獨的PaymentSystemBase基類嗎? – tesicg

+0

當你遵循單一職責原則時,DataBase相關的東西應該以不同的方式處理(可能在Class中)。 ProcessPayment將進入界面。 – Dnyanesh

2

從你的代碼,我認爲,爲了進行付款,我必須: - 驗證/檢查參數 - 處理數據庫連接 - 可能很多更

在我看來這些行動應該由兩個不同的對象完成。 PaymentSystem應該使用它們作爲協作者。沒有抽象類。

拇指這裏的規則是「有利於對繼承組成」:http://www.hautelooktech.com/2013/02/05/design-principle-favor-composition-over-inheritance/

爲了能夠創建不同的支付系統,你可以從你PaymentSystem的一位合作者提取接口和開關它們(又名組成一個新的支付系統)通過財產注入或更好的構造注入。

http://misko.hevery.com/2009/02/19/constructor-injection-vs-setter-injection/

總之,你PaymentSystem應該是一個非常簡單的合作者的 「協調員」。