我只想將一些設計模式注入到我的Java代碼中,但我不知道要使用哪種樣式 - 繼承還是接口首選?爲什麼?選擇繼承或接口以在Java中實現設計模式?
回答
設計模式不是隨意注入到應用程序中的。他們是設計時間的東西,而不是帕瑪森芝士,它已經烘焙後會灑在代碼上。
這就是說,喬希布洛赫的開創性的有效的Java強烈鼓勵開發人員使用接口共享行爲,而不是使用繼承。這符合我自己的經驗。 ETA:除了其他原因,如果您正在實現一個接口,您可以輕鬆地創建該接口的模擬以用於測試,而不必擔心繼承層次結構的其餘部分。
設計模式不會被「注入」到您的代碼中 - 您首先需要注意您的問題類似於許多其他問題解決的問題,並且他們已經提煉出瞭解決問題的模式。最有名的是here
此外,您是否要使用繼承(又名擴展)或接口依賴。通常界面和組成效果更好。
這兩個功能並不相互排斥。接口和實現指定類型和與類型的兼容性。繼承允許有效地共享代碼。在經典設計中,類型層次結構使用接口表示,而代碼重用則使用繼承來實現。
你的意思是「這兩個特徵不是*互斥*」嗎? – 2010-06-09 14:12:12
是的(另外11個) – 2010-07-05 11:52:06
我確實認爲不應該考慮注入或使用某些設計模式。設計模式旨在解決特定環境中的特定問題。
關於接口和繼承:
接口當你需要運行時多態性正在使用。所以,你定義了一個接口,你可以有多個不同的實現。在客戶端代碼中,您可以將引用聲明爲接口類型。現在,您不必在運行時傳遞給客戶端的實際類型的對象。你只關心在引用上調用方法。
interface Car {
void startEngine();
void stopEngine();
}
class Maruti implements Car {
public void startEngine() {
System.out.println("Maruti engine started");
}
@Override
public void stopEngine() {
System.out.println("Maruti engine stopped");
}
}
class Porsche implements Car {
@Override
public void startEngine() {
System.out.println("Porsche engine started");
}
@Override
public void stopEngine() {
System.out.println("Porsche engine stopped");
}
}
在上面的例子中,作爲客戶端,您只需將引用聲明爲Car類型。在運行時,您可以擁有Maruti對象或保時捷對象,您不在乎。你關心的只是調用startEngine或stopEngine。
繼承通常用於代碼重用性和可擴展性。所以,你在兩個類中有共同的代碼,並且這兩個類似乎都屬於一個通用類型,那麼你可以創建一個父類(有時是抽象的),並將通用代碼移到父類中。這樣你可以擺脫重複的代碼。另一個用例是可擴展性,有時你不能控制類的源代碼,仍然希望添加/更改某些行爲。您可以使用繼承並重寫某些方法。
還有一件東西叫做「組合」這是繼承擴展性的一種優選方式。
- 1. 實現/接口繼承設計問題
- 2. 在Java中的繼承(設計模式)
- 3. 接口實現與繼承在C#
- 4. 如何在接口中使用java實現多繼承?
- 5. 在Java中的接口實現的繼承
- 6. 存儲庫模式的通用接口繼承和類實現
- 7. 實現接口擴展屬性(?繼承)
- 8. 接口/繼承/委託設計問題
- 9. 驗證接口的繼承設計
- 10. 錯誤設計實踐:Java多繼承
- 11. rails模板(或實例繼承)選項?
- 12. Java接口和繼承
- 13. 接口和繼承java
- 14. Groovy無法實現使用繼承和泛型的Java接口
- 15. C#繼承設計模式問題
- 16. 多繼承和單例設計模式
- 17. 設計模式爲動態繼承
- 18. Java的設計問題-threads,接口和繼承
- 19. 使用繼承或片段之間的設計選擇
- 20. MVC模型設計/繼承
- 21. 在vb.Net中實現繼承的通用接口
- 22. 在C++中使用繼承的具體類來實現接口
- 23. 如何在繼承自SocketAsyncEventArgs的類中實現IDisposable接口
- 24. 繼承或設置,選項
- 25. 在Java中使用繼承或接口的情況?
- 26. 實現接口在Java中
- 27. 在java中實現接口
- 28. 在MySQL中實現繼承
- 29. C++設計模式問題。單接口多實現?
- 30. 類設計:類實現接口實現另一個接口
什麼是「固有」? – 2010-06-09 14:01:59
繼承我承擔 – Chii 2010-06-09 14:02:26
@彼得托克:繼承,對不起:-) – 2010-06-09 14:08:32