定義
The dependency of one class to another one should depend on the?smallest possible interface.?
類間的依賴關(guān)系應(yīng)該建立在最小的接口上?
它要求是最小的接口辫呻,也是要求接口細(xì)化,接口純潔皂吮。
概括為一句話:建立單一接口铁蹈,不要建立臃腫龐大的接口忌怎。再通俗的說就是接口盡量細(xì)化,同時(shí)接口中的方法盡量少。
接口隔離原則要求接口的方法盡量少罗岖。
場景模擬
假設(shè)你是追星族彼城,每天都在追美女明星诅蝶。
場景模擬UML圖
簡單代碼
@protocol Starts<NSObject>
-(void)goodLooking;
-(void)niceFigure;
@end
#import "Starts.h"
@protocol FindStarts<NSObject>
-(void)findStarts:(id)start;
-(void)show;
@end
#import "FindStarts.h"
@interface Xiaoming : NSObject<FindStarts>
@end
#import "Xiaoming.h"
@interface Xiaoming()
@property (nonatomic,strong) id<Starts>start;
@end@implementation Xiaoming
-(void)findStarts:(id<Start>)start{
? ? self.start = start;
}
-(void)show{
? ? [self.start goodLooking];
? ? [self.start niceFigure];
}
@end
#import "Starts.h"
@interface XuJIaoStart : NSObject<Starts>
@end
@implementation XuJIaoStart
-(void)goodLooking{
? ? NSLog(@"徐嬌有很好看的長相");
}
-(void)niceFigure{
? ? NSLog(@"徐嬌有好身材");
}
@end
測試代碼
id<FindStarts> xiaoming = [Xiaoming new];
id<Starts> xujiao = [XuJIaoStart new];
? ? [xiaoming findStarts:xujiao];
? ? [xiaoming show];
測試結(jié)果
2018-04-04 10:39:23.748776+0800 設(shè)計(jì)模式原則[30377:6025494] 徐嬌有很好看的長相
2018-04-04 10:39:23.748961+0800 設(shè)計(jì)模式原則[30377:6025494] 徐嬌有好身材
場景變更
假設(shè)我們對明星的標(biāo)準(zhǔn)有所改變,不在單純的定義認(rèn)為長相和身材好的明星募壕。只有其中之一就可以了调炬。那上面的代碼就不能適應(yīng)變化了,這主要是因?yàn)榻涌邶嫶笏颈В瑳]有盡量細(xì)化筐眷。根據(jù)接口隔離原則,我們把這兩個(gè)元素拆分习柠。
場景變更UML圖
場景變更代碼
#import "StartsA.h"
#import "StartsB.h"
@protocol FindNewStarts<NSObject>
-(void)findStartsA:(id<StartsA>)start;
-(void)findStartsB:(id<StartsB>)start;
-(void)show;
@end
@protocol StartsA<NSObject>
-(void)goodLooking;
@end
@protocol StartsB<NSObject>
-(void)niceFigure;
@end
#import "FindNewStarts.h"
@interface XiaoHei : NSObject<FindNewStarts>
@end
#import "XiaoHei.h"
@interface XiaoHei()
@property (nonatomic,strong) id<StartsA>startA;
@property (nonatomic,strong) id<StartsB>startB;
@end
@implementation XiaoHei
-(void)findStartsA:(id<StartsA>)start{
self.startA = start;
}
-(void)findStartsB:(id<StartsB>)start{
? ? self.startB = start;
}
-(void)show{
? ? [self.startA goodLooking];
? ? [self.startB niceFigure];
}
@end
#import "StartsA.h"
#import "StartsB.h"
@interface XuJiaoNewStart : NSObject<StartsA,StartsB>
@end
#import "XuJiaoNewStart.h"
@implementation XuJiaoNewStart
-(void)goodLooking{
? ? NSLog(@"徐嬌有很好看的長相");
}
-(void)niceFigure{
? ? NSLog(@"徐嬌有好身材");
}
@end
測試代碼
id<FindNewStarts> xiaohei = [XiaoHei new];
? ? XuJiaoNewStart * xujiao = [XuJiaoNewStart new];
? ? [xiaohei findStartsB:xujiao];
? ? [xiaohei findStartsA:xujiao];
? ? [xiaohei show];
結(jié)果
2018-04-04 10:39:23.748776+0800 設(shè)計(jì)模式原則[30377:6025494] 徐嬌有很好看的長相
2018-04-04 10:39:23.748961+0800 設(shè)計(jì)模式原則[30377:6025494] 徐嬌有好身材
其實(shí)我們這里規(guī)定了徐嬌是兩者都符合的標(biāo)準(zhǔn)明星匀谣,其實(shí)也可以實(shí)現(xiàn)一個(gè)就可以了。這樣擴(kuò)展會更靈活些资溃。
保證接口的純潔性
接口隔離原則是對接口進(jìn)行規(guī)范約束
1.接口要盡量小
這是接口隔離原則的核心定義武翎,接口要盡量小,不要出現(xiàn)臃腫的接口溶锭,但是小也是有限度的宝恶,不能違背單一職責(zé)原則。
2.接口要高內(nèi)聚
高內(nèi)聚就是提高接口,類垫毙,模塊的處理能力霹疫,減少對外的交互。具體到接口隔離原則就是要求在接口中盡量減少公布public方法综芥,接口是對外的承諾丽蝎,承諾越少對系統(tǒng)開發(fā)越有利,變更的風(fēng)險(xiǎn)就越少膀藐。
3.接口設(shè)計(jì)是有限度的
接口的設(shè)計(jì)粒度越小屠阻,系統(tǒng)越靈活。但是靈活的同時(shí)也帶來了結(jié)構(gòu)復(fù)雜额各,開發(fā)難度大国觉,可維護(hù)性降低。所以接口設(shè)計(jì)要注意適度虾啦。
接口隔離原則開發(fā)經(jīng)驗(yàn)
接口隔離原則是對接口的定義麻诀,同時(shí)也是對類的定義,接口和類盡量使用原子接口或原子類來組裝缸逃。我們在實(shí)踐中可以以下幾個(gè)規(guī)則來衡量:
一個(gè)接口只服務(wù)于一個(gè)子模塊或業(yè)務(wù)邏輯
通過業(yè)務(wù)邏輯壓縮接口中的public方法针饥,接口要不斷的精簡,以達(dá)到接口不斷完善
已經(jīng)被污染的接口需频,盡量去修改丁眼,若變更的風(fēng)險(xiǎn)較大,則采用適配器進(jìn)行轉(zhuǎn)化處理
談?wù)剬W(xué)習(xí)接口隔離原則的感想
設(shè)計(jì)接口的粒度越小昭殉,系統(tǒng)越靈活是肯定的苞七。但是過度把接口設(shè)計(jì)粒度鎖到很小,這樣會增加系統(tǒng)閱讀代碼的復(fù)雜度挪丢。接口設(shè)計(jì)盡量使其能完成一個(gè)特有的功能蹂风,而不能把一個(gè)功能再進(jìn)行拆分,拆分出好多接口來乾蓬,這就過度設(shè)計(jì)了惠啄,度很難把握。
參考博客
下一篇博客