接口隔離定義:
一般有兩種定義:
1:客戶端不應該依賴他不需要的接口
2:類間的依賴關系應該建立在最小的接口上
我們在建立接口時,應該盡量建立單一,不臃腫龐大的接口,應盡量使接口細化,方法盡量少。
接口隔離原則與單一原則的區別:
接口隔離原則和單一職責原則的審視角度不同,單一職責原則要求類和接口的職責單一,這是業務邏輯上的划分。接口隔離原則要求接口的方法盡量少,細化。
接口隔離原則的應用:
美女,我們一般認為有好的面孔,好的身材,好的脾氣。那我們來定義一個美女的接口,有好的面孔,好的身材,好的脾氣。
public interface IPettyGirl { void GoodLooking();//要有好的面孔 void NiceFigure();//要有好身材 void GoodTemperament();//要有好氣質 }
實現一個具體的美女:
public class PettyGirl : IPettyGirl { private string name; public PettyGirl(string name) { this.name = name; } public void GoodLooking() { Console.WriteLine(name + "---有好的面孔"); } public void NiceFigure() { Console.WriteLine(name + "---有好身材"); } public void GoodTemperament() { Console.WriteLine(name + "---有好氣質"); } }
美女已經實現,我們定義一個抽象的星探類:
public abstract class AbstractSearcher { protected PettyGirl pettyGirl; public AbstractSearcher(IPettyGirl pettyGirl) { this.pettyGirl = (PettyGirl)pettyGirl; } public abstract void Show(); }
實現一個具體的星探:
public class Searcher : AbstractSearcher { public Searcher(IPettyGirl pettyGirl) : base(pettyGirl) { } public override void Show() { Console.WriteLine("----美女的信息如下:---"); //顯示好的面孔 base.pettyGirl.GoodLooking(); //顯示好身材 base.pettyGirl.NiceFigure(); //顯示好氣質 base.pettyGirl.GoodTemperament(); } }
然后在一個場景中實現一個星探找美女的過程:
class Program { static void Main(string[] args) { IPettyGirl xiaoHong = new PettyGirl("小紅"); AbstractSearcher searcher = new Searcher(xiaoHong); searcher.Show(); Console.ReadKey(); } }
顯示運行結果:
----美女的信息如下:--- 小紅---有好的面孔 小紅---有好身材 小紅---有好氣質
然而,隨着人們審美觀點的變化,美女的定義也在發生變化,人們也會把面容一般,身材一般,脾氣特別好的女孩定義為美女,如氣質美女,但是,我們的接口已經定義了美女具備的三個條件,氣質美女不是我們定義美女的標准,這時,我們應該將接口量化,因為我們以前定義的美女太過寬泛,把美女接口拆分為兩個接口,一個是外形美女接口,一個是氣質美女接口,這樣我的接口才靈活,易於擴展和維護。
定義兩個接口:外形美女和氣質美女
public interface IGoodBodyGirl { void GoodLooking();//要有好的面孔 void NiceFigure();//要有好身材 } public interface IGoodTemperamentGirll { void GoodTemperament();////要有好氣質 }
最標准美女:
public class PettyGirl : IGoodBodyGirl, IGoodTemperamentGirl { private string name; public PettyGirl(string name) { this.name = name; } public void GoodLooking() { Console.WriteLine(name + "---有好的面孔"); } public void NiceFigure() { Console.WriteLine(name + "---有好身材"); } public void GoodTemperament() { Console.WriteLine(name + "---有好氣質"); } }
保證接口的純潔性
接口隔離原則是對接口進行規范約束。
接口要盡量小
這是接口隔離原則的核心定義,接口要盡量小,不要出現臃腫的接口,但是小也是有限度的,不能違背單一職責原則。
接口要高內聚
高內聚就是提高接口,類,模塊的處理能力,減少對外的交互。具體到接口隔離原則就是要求在接口中盡量減少公布public方法,接口是對外的承諾,承諾越少對系統開發越有利,變更的風險就越少。
接口設計是有限度的
接口的設計粒度越小,系統越靈活。但是靈活的同時也帶來了結構復雜,開發難度大,可維護性降低。所以接口設計是注意度。
接口隔離原則開發經驗
接口隔離原則是對接口的定義,同時也是對類的定義,接口和類盡量使用原子接口或原子類來組裝。我們在實踐中可以以下幾個規則來衡量:
- 一個接口只服務於一個子模塊或業務邏輯
- 通過業務邏輯壓縮接口中的public方法,接口要不斷的精簡,以達到接口不斷完善
- 已經被污染的接口,盡量去修改,若變更的風險較大,則采用適配器進行轉化處理