定義
程序間不依賴不需要的接口重抖,且依賴最小的接口
兩種接口
- 實例接口
實例接口書中的意思是java類中new關(guān)鍵字生成的實例,此java類就是實例類的接口(我個人理解是跟依賴倒置或者說面向接口編程一起考慮的昭齐,那樣我們依賴的就是抽象接口,不用考慮實例類矾柜,但是不是所有都適用依賴倒置原則阱驾,所以實體類也可以借鑒接口隔離原則就谜,思想是相通的) - 類接口
類接口就是指Java中interface關(guān)鍵字定義的接口
兩層含義
- 客戶端不應該依賴它不需要的接口
這個很好理解,就是類不需要引用它不需要的接口 - 類間的依賴關(guān)系應該建立在最小的接口上
這個要求的是接口盡量細化里覆,保證單一原則就好丧荐,接口純潔
實例
書中是以一個星探發(fā)現(xiàn)漂亮女生為例子,介紹了兩種PettyGril判斷方式喧枷,應該做接口分離虹统,首先是接口不分離的代碼
public interface IPettyGirl {
//好的面容
void goodLooking();
//好的身材
void niceFigure();
//好的氣質(zhì)
void greatTemperament();
}
public class PettyGirl implements IPettyGirl {
//美女名字
private String name;
public PettyGirl(String name) {
this.name = name;
}
@Override
public void goodLooking() {
System.out.println(this.name + "_面容姣好");
}
@Override
public void niceFigure() {
System.out.println(this.name + "_身材好");
}
@Override
public void greatTemperament() {
System.out.println(this.name + "_氣質(zhì)好");
}
}
public interface ISearcher {
//搜索美女顯示信息
void show();
}
public abstract class AbstractSearcher implements ISearcher{
protected IPettyGirl pettyGirl;
public AbstractSearcher(IPettyGirl pettyGirl) {
this.pettyGirl = pettyGirl;
}
public abstract void show();
}
public class Searcher extends AbstractSearcher {
public Searcher(IPettyGirl pettyGirl) {
super(pettyGirl);
}
@Override
public void show() {
//展示面容
super.pettyGirl.goodLooking();
//展示身材
super.pettyGirl.niceFigure();
//展示氣質(zhì)
super.pettyGirl.greatTemperament();
}
public static void main(String[] args) {
new Searcher(new PettyGirl("lisa")).show();
}
}
因為現(xiàn)實中存在面容一般,身材一般但是氣質(zhì)非常好的女子隧甚,所以上面一個IPettyGirl需要拆分成兩個接口IGoodBodyGirl和车荔,拆分之后的代碼如下
public interface IGoodBodyGirl {
//好的面容
void goodLooking();
//好的身材
void niceFigure();
}
public interface IGreatTemperamentGirl {
//好的氣質(zhì)
void greatTemperament();
}
public class PettyGirl implements IGoodBodyGirl, IGreatTemperamentGirl {
//美女名字
private String name;
public PettyGirl(String name) {
this.name = name;
}
@Override
public void goodLooking() {
System.out.println(this.name + "_面容姣好");
}
@Override
public void niceFigure() {
System.out.println(this.name + "_身材好");
}
@Override
public void greatTemperament() {
System.out.println(this.name + "_氣質(zhì)好");
}
}
public abstract class AbstractSearcher implements ISearcher{
protected IGoodBodyGirl goodBodyGirl;
protected IGreatTemperamentGirl greatTemperamentGirl;
public AbstractSearcher(IGoodBodyGirl goodBodyGirl) {
this.goodBodyGirl = goodBodyGirl;
}
public AbstractSearcher(IGreatTemperamentGirl greatTemperamentGirl) {
this.greatTemperamentGirl = greatTemperamentGirl;
}
public AbstractSearcher(IGoodBodyGirl goodBodyGirl, IGreatTemperamentGirl greatTemperamentGirl) {
this.goodBodyGirl = goodBodyGirl;
this.greatTemperamentGirl = greatTemperamentGirl;
}
public abstract void show();
}
public class Searcher extends AbstractSearcher {
public Searcher(IGoodBodyGirl goodBodyGirl) {
super(goodBodyGirl);
}
public Searcher(IGreatTemperamentGirl greatTemperamentGirl) {
super(greatTemperamentGirl);
}
public Searcher(IGoodBodyGirl goodBodyGirl, IGreatTemperamentGirl greatTemperamentGirl) {
super(goodBodyGirl, greatTemperamentGirl);
}
@Override
public void show() {
//展示面容
super.goodBodyGirl.goodLooking();
//展示身材
super.goodBodyGirl.niceFigure();
//展示氣質(zhì)
super.greatTemperamentGirl.greatTemperament();
}
public static void main(String[] args) {
new Searcher(new PettyGirl("lisa"), new PettyGirl("lucy")).show();
}
}
接口規(guī)范約束
- 接口要盡量小,但是不能違反單一職責原則
- 接口要高內(nèi)聚戚扳,就是提高自身的處理能力忧便,減少對外的交互
- 定制服務,為每個個體提供優(yōu)良的服務咖城,考慮好性能等問題
- 接口設計是有限度的茬腿,設計粒度越小系統(tǒng)越靈活,但是會增加開發(fā)難度宜雀,降低可維護性
最佳實踐
- 一個接口只服務于一個子模塊或業(yè)務邏輯
- 通過業(yè)務邏輯壓縮接口中的public方法切平,接口時長去回顧
- 已經(jīng)被污染的接口盡量去修改
- 拒絕盲從,根據(jù)自身業(yè)務邏輯去設計
總結(jié)與思考
在實際的項目開發(fā)中寫接口很容易為了方便寫得臃腫辐董,原因就是邊界并不容易思考得清晰悴品,導致的一個常見問題是兩個接口可能有兩個功能本質(zhì)上是重復的,所以在編寫接口時盡量小且不違反單一職責原則去做简烘。當然也可以在一定項目階段之后做一些項目的回顧并做好CodeReview工作可以盡量減少此類問題苔严。