- 在軟件開發(fā)中惜索,為了提高軟件系統(tǒng)的可維護(hù)性和可復(fù)用性,增加軟件的可擴(kuò)展性和靈活性绍在,程序員要盡量根據(jù)7條原則來開發(fā)程序门扇,從而提高軟件的開發(fā)效率雹有,節(jié)約軟件開發(fā)成本和維護(hù)成本,我們將在下面的幾節(jié)中依次來介紹者7條原則臼寄,本節(jié)介紹里接口隔離原則
接口隔離原則定義
:設(shè)計(jì)編碼過程中盡量將臃腫龐大的接口拆分成更小的和更具體的接口霸奕,讓接口中只包含客戶感興趣的方法。
接口隔離原則由來
2002年羅伯特·c·馬丁 給“接口隔離原則”的定義是:客戶端客戶端不應(yīng)該被迫依賴于它不使用的方法(Clients should not be forced to depend on methods they do not use)吉拳。該原則還有另一個(gè)定義:一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小接口上质帅。(The dependency one class to another one should depend on the smallest interface).
為各個(gè)類建立他們需要的專用接口,不要試圖建立一個(gè)龐大的接口供所有依賴他的類調(diào)用留攒。
接口隔離原則和單一職責(zé)都是為了提高類的內(nèi)聚力拭宁,降低他們之間耦合度洛退,體現(xiàn)了封裝的思想,但兩者是不同的:
- 單一職責(zé)原則注重職責(zé)杰标,接口隔離原則注重接口依賴的隔離
- 單一職責(zé)原則是約束類兵怯,它針對(duì)的是程序中的實(shí)現(xiàn)和細(xì)節(jié),接口隔離原則主要約束接口腔剂,這對(duì)抽象和程序整體框架的設(shè)計(jì)媒区。
接口隔離原則的優(yōu)點(diǎn)
1.降低接口粒度,提高接口靈活性掸犬,可維護(hù)性
2.提高系統(tǒng)內(nèi)聚性袜漩,減少對(duì)外互動(dòng),降低系統(tǒng)的耦合性
3.使類對(duì)外的暴露部分顯得有層次湾碎,接口間的繼承也可以使細(xì)粒度的接口之間有辨識(shí)度
4.減少冗余代碼噪服,沒有不必要的實(shí)現(xiàn)方法
接口合理原則實(shí)現(xiàn)方法
1.接口盡量有限度的小且只服務(wù)一個(gè)子模塊或業(yè)務(wù)邏輯
2.為依賴接口類定制服務(wù),只提供調(diào)用者需要的方法胜茧,屏蔽不需要的方法
3.深度了解業(yè)務(wù)粘优,盡可能按需分配,高內(nèi)聚呻顽,減少不必要的對(duì)外暴露雹顺,用最少的代碼完成業(yè)務(wù)
【例】 學(xué)生成績管理程序
分析:學(xué)生成績管理程序一般包含插入成績、刪除成績廊遍、修改成績嬉愧、計(jì)算總分、平均分喉前、打印没酣、查詢等功能王财。將他們分別放到不同模塊中,輸入模塊裕便、統(tǒng)計(jì)模塊绒净、打印模塊、如圖:
package principle;
public class ISPtest {
public static void main(String[] args) {
InputModule input = StuScoreList.getInputModule();
CountModule count = StuScoreList.getCountModule();
PrintModule print = StuScoreList.getPrintModule();
input.insert();
count.countTotalScore();
print.printStuInfo();
//print.delete();
}
}
//輸入模塊接口
interface InputModule {
void insert();
void delete();
void modify();
}
//統(tǒng)計(jì)模塊接口
interface CountModule {
void countTotalScore();
void countAverage();
}
//打印模塊接口
interface PrintModule {
void printStuInfo();
void queryStuInfo();
}
//實(shí)現(xiàn)類
class StuScoreList implements InputModule, CountModule, PrintModule {
private StuScoreList() {
}
public static InputModule getInputModule() {
return (InputModule) new StuScoreList();
}
public static CountModule getCountModule() {
return (CountModule) new StuScoreList();
}
public static PrintModule getPrintModule() {
return (PrintModule) new StuScoreList();
}
public void insert() {
System.out.println("輸入模塊的insert()方法被調(diào)用偿衰!");
}
public void delete() {
System.out.println("輸入模塊的delete()方法被調(diào)用挂疆!");
}
public void modify() {
System.out.println("輸入模塊的modify()方法被調(diào)用!");
}
public void countTotalScore() {
System.out.println("統(tǒng)計(jì)模塊的countTotalScore()方法被調(diào)用下翎!");
}
public void countAverage() {
System.out.println("統(tǒng)計(jì)模塊的countAverage()方法被調(diào)用缤言!");
}
public void printStuInfo() {
System.out.println("打印模塊的printStuInfo()方法被調(diào)用!");
}
public void queryStuInfo() {
System.out.println("打印模塊的queryStuInfo()方法被調(diào)用视事!");
}
}
打印輸出
輸入模塊的insert()方法被調(diào)用胆萧!
統(tǒng)計(jì)模塊的countTotalScore()方法被調(diào)用!
打印模塊的printStuInfo()方法被調(diào)用俐东!