設計原則系列文章
必知必會的設計原則——單一職責原則
必知必會的設計原則——開放封閉原則
必知必會的設計原則——依賴倒置原則
必知必會的設計原則——里氏替換原則
概述
1、 客戶端不應該依賴它不需要的介面。
2、 一個類對另一個類的依賴應該建立在最小介面上。
3、介面應儘量細分,不要在一個介面中放很多方法。
介面分離和單一原則關係
單一職責:只做一件事 /影響類變化的原因只有一個。目的是你為了高內聚(模組內部的相似程度).
介面隔離:目的是為了低耦合(模組之間的依賴程度要低)。
未使用介面隔離原則的程式碼
public interface IScore { void QueryScore(); void UpdateScore(); void AddScore(); void DeleteScore(); double GetSumScore(); double GetAvgScore(); void PrintScore(); void SendScore(); } public class Teacher : IScore { public void AddScore() { throw new NotImplementedException(); } public void DeleteScore() { throw new NotImplementedException(); } public double GetAvgScore() { throw new NotImplementedException(); } public double GetSumScore() { throw new NotImplementedException(); } public void PrintScore() { throw new NotImplementedException(); } public void QueryScore() { throw new NotImplementedException(); } public void SendScore() { throw new NotImplementedException(); } public void UpdateScore() { throw new NotImplementedException(); } } public class Student : IScore { public void AddScore() { throw new NotImplementedException(); } public void DeleteScore() { throw new NotImplementedException(); } public double GetAvgScore() { throw new NotImplementedException(); } public double GetSumScore() { throw new NotImplementedException(); } public void PrintScore() { throw new NotImplementedException(); } public void QueryScore() { throw new NotImplementedException(); } public void SendScore() { throw new NotImplementedException(); } public void UpdateScore() { throw new NotImplementedException(); } }
以上定義成績介面,介面裡麵包含的方法分別為查詢成績,新增成績、修改成績、刪除成績、成就求和,成績求平均數、列印成績、傳送成績。Teacher和student類都實現IScore的方法 ,有些方法教師或學生根本沒必要實現。
使用介面隔離原則的程式碼
public interface ITeacherScore { void AddScore(); void DeleteScore(); double GetSumScore(); double GetAvgScore(); void PrintScore(); void SendScore(); } public class Teacher2 : ITeacherScore { public void AddScore() { throw new NotImplementedException(); } public void DeleteScore() { throw new NotImplementedException(); } public double GetAvgScore() { throw new NotImplementedException(); } public double GetSumScore() { throw new NotImplementedException(); } public void PrintScore() { throw new NotImplementedException(); } public void SendScore() { throw new NotImplementedException(); } } public interface IStudentScore { void QueryScore(); void PrintScore(); } public class Student2 : IStudentScore { public void PrintScore() { throw new NotImplementedException(); } public void QueryScore() { throw new NotImplementedException(); } }
以上程式碼使用介面隔離原則後,介面職責很清晰,定義的介面不再像之前的大而全。
總結
介面隔離原則和單一職責原則很像,關於二者之間的關係在開頭概述裡面已經描述,如有疑問歡迎與我交流。