[英]Choose inheritance or interface to implement design pattern in Java?
我只是想在我的Java代碼中注入一些設計模式,但我不知道使用哪種樣式 - 是繼承還是接口首選? 為什么?
設計模式不是隨機注入您的應用程序的東西。 它們是設計時的各種東西,而不是在你的代碼已經烘焙后撒在你的代碼上的帕瑪森奶酪。
也就是說,Josh Bloch的開創性Effective Java強烈鼓勵開發人員使用接口來實現共享行為,而不是使用繼承。 這符合我自己的經驗。
ETA:除其他原因外,如果您正在實現一個接口,您可以輕松地創建該接口的模擬以用於測試,而不必擔心繼承層次結構的其余部分。
設計模式不會“注入”您的代碼 - 您首先需要注意的是,您的問題類似於許多其他問題解決的問題,並且他們已經提出了解決問題的模式。 最着名的就是這里
另外,對於是否要使用繼承(又稱擴展)或接口依賴。 通常界面和組合效果更好。
這兩個功能並不相互排斥。 接口和實現指定類型和與類型的兼容性。 繼承允許有效地共享代碼。 在經典設計中,類型層次結構使用接口表示,而代碼重用是使用繼承實現的。
我同意不應該考慮使用某些設計模式注入OR。 設計模式旨在解決給定環境中的非常具體的問題。
關於接口和繼承:
當您需要運行時多態時,正在使用接口 。 因此,您定義了一個接口,您可以擁有多個不同的實現。 在客戶端代碼中,您只需將引用聲明為接口類型即可。 現在,您不必擔心在運行時傳遞給客戶端的實際對象類型。 您只關心在引用上調用方法。
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。
繼承通常用於代碼可重用性和可擴展性。 因此,您在兩個類中有共同的代碼,並且兩者似乎都屬於一個公共類型,然后您可以創建一個父類(有時候是抽象的)並在父類中移動公共代碼。 這樣你就可以擺脫重復的代碼。 另一個用例是可擴展性,有時您無法控制類的源代碼,仍然希望添加/更改某些行為。 您可以使用繼承並覆蓋某些方法。
還有一個叫做“組合”的東西,它比繼承的可擴展性更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.