簡體   English   中英

選擇繼承或接口來實現Java中的設計模式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM