上一節咱們學習了單一職責原則,簡單來講就是各司其職,廚師就專一作好菜,不要跑到前堂作起小二。app
可是呢,萬事無一絕對。若是隻是小飯店有時候也不是特別嚴格。仍是那句話,原則是死的,人是活的。ide
接下來咱們來學習接口隔離原則。學習
客戶端不該該依賴它不須要的接口,即一個類對另外一個類的依賴應該創建在最小的接口上。設計
怎麼理解呢?code
就是說,一個接口擁有的行爲應該儘量的小。接口
若是說這個接口定義了不少方法,可是呢,咱們實現這個接口的時候並不須要這麼多的方法。那麼你就會發現,除了個別幾個你須要的方法實現了,不少不須要的方法也必須得實現了,形成不少空方法的出現。class
這是一種很糟糕的設計,這樣作不只會強制實現原本不應實現的方法,最嚴重的是會給使用者形成假象,即這個實現類擁有接口中全部的行爲,結果調用方法時卻沒收穫到想要的結果。擴展
案例以下:jdk
public interface Car { void run(); void fly(); void appearance(); }
public class Audi implements Car { public static void main(String args[]){ Audi audi = new Audi(); audi.run(); audi.appearance(); audi.fly(); } @Override public void appearance() { System.out.println("我奧迪有炫酷的車燈"); } @Override public void run() { System.out.println("我不光能跑,我還跑的很快"); } @Override public void fly() { } }
上訴代碼輸出結果方法
我不光能跑,我還跑的很快 我奧迪有炫酷的車燈
上訴代碼中的接口Car就沒有遵循最小接口原則。由於這個接口定義了一個並不屬於Car的方法fly()。你在實現這個接口的時候你也必須重寫fly()方法。
可是呢,車並無這個功能,因此大部分狀況下你會將這個方法重寫了可是裏面是空方法。
首先代碼不簡潔。其次當某我的調用該類方法的時候,就會給使用者形成車會飛的假象。
上述代碼在JDK1.8版本之後還能能寫成這種形式
public interface Car { default void run(){ System.out.println("我能跑"); } default void fly(){ System.out.println(("我不能飛")); } void appearance(); }
public class Audi implements Car { public static void main(String args[]){ Audi audi = new Audi(); audi.run(); //我不光能跑,我還跑的很快 audi.appearance(); //我有炫酷的車燈 audi.fly(); //我不能飛 } @Override public void appearance() { System.out.println("我有炫酷的車燈"); } @Override public void run() { System.out.println("我不光能跑,我還跑的很快"); } }
在jdk1.8之後提供了default關鍵字,這個關鍵字的出現讓接口可以有默認的實現方式。
好比Car接口的的run()方法和fly()方法實現了default關鍵字,那麼就能直接在接口當中把這個方法給實現了。
當某個類實現了這個接口的時候,就不須要強制重寫該方法。
有人就會問了,是否是在1.8版本之後就能夠不須要遵循最小接口原則了?答案是否認了。
即使你不須要實現這個方法,可是在使用者眼中,就會給使用者形成車會飛的假象。
固然,仍是那句話,人是活的,規則是死的。不少時候咱們並非說必須百分百按照這種要求來實現咱們的代碼。
當你的代碼嚴格實現該原則的時候發現,致使代碼的可閱讀性,可擴展性下降。甚至邏輯也複雜了不少。那麼就能夠按照具體的狀況違背這種原則。
接口隔離原則和職責單一原則有共同性。你們能夠多思考一下。
仍是那句話慢慢的學,一個一個掌握,才更深入,貪多嚼不爛。
下一篇咱們來學習依賴倒轉原則。