Whatjava
Interface Segregation Principle(ISP):客戶端不該該依賴它不須要的接口;類間的依賴關係應該創建在最小的接口上程序員
Why網站
「不該該強迫客戶依賴於它們不用的方法。接口屬於客戶,不屬於它所在的類層次結構。」這個說得很明白了,再通俗點說,不要強迫客戶使用它們不用的方法,若是強迫用戶使用它們不使用的方法,那麼這些客戶就會面臨因爲這些不使用的方法的改變所帶來的改變。code
How接口
如今有一個接口,做用是編寫一個網站,其中有兩個方法ip
interface IWriteWebsite { //實現UI void WriteWebsiteUI(); //實現邏輯代碼 void WriteWebsiteLogic(); }
經驗豐富的程序員類,能夠單獨完成開發網站的任務ci
//經驗豐富的程序員 class ExperiencedProgrammer : IWriteWebsite { public void WriteWebsiteUI() { Console.WriteLine("實現界面"); } public void WriteWebsiteLogic() { Console.WriteLine("實現後臺邏輯"); } }
可是咱們會發現,有一些經驗不是那麼豐富的程序員只能完成一個方向的工做,多是界面方向也多是後臺方向,那麼咱們若是實現原有的編寫網站的接口,那部分他不會的技能就不能實現,那麼這樣一來就違反了單一職責原則以及里氏替換原則,因此咱們能夠將編寫網站的接口拆分紅IWriteWebsiteUI及IWriteWebsiteLogic兩個接口,這樣的話,經驗豐富的程序員實現這兩個接口,而對應方向的程序員實現各自的接口就能夠了。這樣在接口的複用上,也達到了想要的效果。開發
編寫網站邏輯接口it
interface IWriteWebsiteLogic { void WriteLogic(); }
編寫網站界面接口io
interface IWriteWebsiteUI { void WriteUI(); }
編寫邏輯的程序員類
class LogicProgrammer : IWriteWebsiteLogic { public void WriteLogic() { Console.WriteLine("實現後臺邏輯"); } }
編寫界面的程序員類
class UIProgrammer : IWriteWebsiteUI { public void WriteUI() { Console.WriteLine("實現界面"); } }
經驗豐富的程序員類
class ExperiencedProgrammer : IWriteWebsiteLogic, IWriteWebsiteUI { public void WriteLogic() { Console.WriteLine("實現後臺邏輯"); } public void WriteUI() { Console.WriteLine("實現界面"); } }
上面只是一個簡單的示例,其中有不少的東西都沒有加入,好比抽象的程序員類,而這個類應該具備可演示的工做結果等等。這裏是爲了演示一下相關的臃腫接口拆開以後帶來的好處。當細粒度減少以後,複用性就提升了;類也不須要實現不合適的接口而形成承擔不須要承擔的行爲,也不存在違反LSP或者SRP。
單一職責原則同接口隔離原則的異同:類似之處都是起到了瘦身的做用,減小耦合性;不一樣的地方固然是職責是一種能力,可能能夠處理某同樣事物須要不少個接口。接口跟職能仍是有差異的。