2013-08-01 52 views
1

這是情況。 我們有兩臺來自不同供應商(製造商)的打印機。 我們希望頂級代碼不知道關於提供者的細節,只使用統一的API。 所以我開始提取一個接口。如何設計兩個類似(但不完全)的類?

public interface IPrinterProvider { 
    bool Connect(string comPort); 
    bool IsConnected(); 
} 

好的。 現在,我意識到一臺打印機需要密碼屬性,但其他打印機不需要。 那麼,我該怎麼辦?

再次。 據我所知,我會有一個或幾個接口和一些實現者。 但是來電者將如何工作? 我應該創建一個單獨的類,它可能不實現任何接口?例如:

public class CommonPrinterProvider { 
    private IPrinterProvider printerProvider; 
    public CommonPrinterProvider(IPrinterProvider printerProvider) { 
     this.printerProvider= printerProvider; 
    } 
} 

所以,共有兩個問題。

+0

您可以通過暴露KeyValuePair列表,讓您需要的參數,如用戶名,密碼等的集合中通過處理第一個問題...這可能再拉由於實施和當時的需要DED。這保持了你的抽象通用性 –

回答

5

我將封裝打印機的「設置」(或,更準確地說,「連接設置」)到另一個類,並在interface。有點像這樣:

public class PrinterSettings { 
    public string Password { get; set; } 
    public int Port { get; set; } 
    /* .. others .. */ 
} 

public interface IPrinterProvider { 
    void Initialize(PrinterSettings settings); 
    bool Connect(string comPort); 
    bool IsConnected(); 
} 

然後,每個實現可以以他們認爲合適的方式處理設置。

+0

這是比我上面的建議更好的解決方案,因爲它可以保持你的強打字:) –

+0

那麼第二個問題呢?我的意思是,我應該創建一個單獨的類,像客戶端將調用的外觀那樣嗎? – EngineerSpock

+1

我會說一個工廠。我不知道你的架構的其餘部分是如何建立的,但是從你提供的內容來看,Fascade只是你不需要的另一個層。一個直接的工廠返回一個'IPrinterProvider'的實現就是你需要的。 –

1

最好儘可能統一你的界面。確實的接口實現(類)將有所不同,但處理它們應該隱藏在strategies中。 調用者應該使用接口,最好將實例化到IoC圖層。下一步將是創建將爲特定實現提供所有必需設置的服務。每個服務類型將由每個單獨的提供者使用。那麼你會有一個不錯的SOC。在這個級別上,你將擁有具有相同接口的並行結構,並且實現了一個完美的配合。

1

一種方法是提供IPrinterProvider的繼承接口。這個新的界面將有密碼除了將添加的所有屬性等:

public interface IPrinterProvider 
{ 
    bool Connect(string comPort); 
    bool IsConnected(); 
} 

public interface IPasswordPrinterProvider : IPrinterProvider 
{ 
    string Password { get; set; } 
} 

這種方式繼承接口包含所有相同的事情,IPrinterProvider,還延伸那些自身。沒有密碼選項的那些實現原始IPrinterProvider的類將沒有任何負擔。

-1

你可以用這樣的東西... 有點類似於工廠模式。

抽象類:

public abstract class PrinterProvider 
{ 
    public string Password{get;private set;} 
    public abstract bool connect(string port); 
    public bool IsConnected() 
    { 
     return true; 
    } 
} 

具體類1:

public class PrinterCompany1 : PrinterProvider 
{ 
    public override bool connect(string port) 
    { 
     // some code here 
     // If it needs password 
     return true; 
    } 
} 

具體類2:

public class PrinterCompany2:PrinterProvider 
{ 
    // Printer that doesnt need password 
    public override bool connect(string port) 
    { 
     return false; 
    } 
} 

最後訪問所有這些具體的類,動態多態性的幫助...

 PrinterProvider provider; 

     // First provider 
     provider = new PrinterCompany1(); 
     provider.connect("temp"); 
     // Second provider 
     provider = new PrinterCompany2(); 
     provider.connect("temp2"); 

請參閱工廠模式更詳細的說明...

0

你可以只留下您的接口是和實現一個類臨危密碼等,這並不:

public class PasswordPrinterProvider : IPrinterProvider 
{ 
    private readonly string password; 
    public PasswordPrinterProvider(string password) 
    { 
     this.password = password; 
    } 
    public bool Connect(string comPort) {...} 
    public bool IsConnected() {...} 
} 
相關問題