引言
在項目開辟中,有時刻會碰到如許的一種情形:須要應用之前開辟的“一些現存的對象”,然則新情況中請求的接口是這些現存對象所不知足的。如何應對這類遷徙的需求?使得可以復用這些對象,以知足新的運用情況,這就是適配器(Adapter)所要處理的成績。
界說
“將一個類的接口轉換成客戶願望的別的一個接口。適配器形式使得本來因為接口不兼容而不克不及一路任務的那些類可以一路任務。”
最後的界說湧現於《設計形式》(Addison-Wesley,1994)。
這個界說應當很好懂得,生涯中也隨處充斥著適配器形式的運用,好比說我們手機的充電器:手機是不克不及在220V電源上直接充電的,充電器將電壓轉換成手機須要的電壓後,手機才可以正常充電,這個充電器就起到了適配的感化。
構造圖
有兩種完成適配器形式的方法。第一種是經由過程繼續來適配兩個接口,這稱為類適配器。在Gof引見設計形式的書中,類適配器是經由過程多重繼續來完成的。書中應用的說話是C++,它並沒有C#的接口或OC的協定如許的語法,一切都是類。在OC中,類可以完成協定,同時又繼續父類,到達C++多繼續的後果。要在OC中完成類適配器,起首須要有界說了客戶端要應用的一套行動的協定,然後要器具體的適配器類來完成這個協定。適配器類同時也要繼續被適配者。類適配器構造圖以下所示:
從圖中可以看到,Adapter是一個Target類型,同時也是Adaptee類型。它重載了Target的request辦法,沒有重載Adaptee中的specificRequest辦法,而是在Adapter的request辦法的完成中,挪用父類的specificRequest辦法。只要當Target是協定而不是類時,類適配器能力夠用OC來完成,由於OC中是沒有多重繼續的。
完成適配器形式的第二種方法稱為對象適配器。與類適配器分歧,對象適配器不繼續被適配者,而是組合了一個對它的援用。對象適配器構造圖以下所示:
從兩個構造圖可以看到,Target和Adapter的關系雷同,Adapter和Adaptee之間的關系,由繼續釀成了聯系關系。這類關系下,Adapter須要堅持一個對Adaptee的援用。在request辦法中,Adapter發送[_adaptee specificRequest]新聞給Adaptee,以完成客戶真個要求。
很明顯,OC中經常使用的拜托(Delegate)形式屬於對象適配器。以經常使用的UITableViewDelegate為例,我這裡先畫出它的構造圖,以下所示:
UITableView(對象適配器中的Client腳色)處置選中行事宜時,新聞會傳遞給UITableViewDelegate(對象適配器中Target腳色),然後挪用MyViewController(對象適配器中Adapter腳色)外面的- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath辦法來停止處置,在MyViewController的這個辦法中,我們會挪用其他對象(好比說我們能夠會挪用概況DetailViewController對象來跳轉到概況頁面)來處置該新聞。
實例
Target類接口
#import <Foundation/Foundation.h>
@interface Target:NSObject
-(void)Request;
@end
Target類完成
#import "Target.h"
@implementation Target
-(void)Request{
NSLog(@"通俗要求!");
}
@end
Adaptee類接口
#import <Foundation/Foundation.h>
@interface Adaptee:NSObject
-(void)SpecificRequest;
@end
Adaptee類完成
#import "Adaptee.h"
@implementation Adaptee
-(void)SpecificRequest{
NSLog(@"特別要求!");
}
@end
Adapter類接口
#import "Target.h"
@class Adaptee;
@interface Adapter :Target{
Adaptee *adaptee;
}
@end
Adapter類完成
#import "Adapter.h"
#import "Adaptee.h"
@implementation Adapter
-(id)init{
if (self == [super init]) {
adaptee = [[Adaptee alloc]init];
}
return self;
}
-(void)Request{
[adaptee SpecificRequest];
}
@end
Main辦法挪用
#import <Foundation/Foundation.h>
#import "Adapter.h"
int main(int argc,const char *argv[])
{
@autoreleasepool{
Target *target = [[Adapter alloc]init];
[target Request];
}
return 0;
}
小結
1.適配器形式重要運用於“願望復用一些現存的類,然則接口又與復用情況請求紛歧致的情形”,在遺留代碼復用、類庫遷徙等方面異常有效。
2.適配器形式有對象適配器和類適配器兩種情勢的完成構造,然則類適配器采取“多繼續”的完成方法,帶來了不良的高耦合,所以普通不推舉應用,別的,OC中也不支撐多重繼續。對象適配器采取“對象組合”的方法,更相符松耦合標准。
在以下各類情形下可以斟酌應用適配器形式:
1.須要應用一個曾經存在的類,而它的接口不相符新情況的標准。
2.想創立一個可以復用的類,該類可以與其他不相干的類或弗成預感的類(即那些接口能夠紛歧定兼容的類)協同任務。
【詳解Objective-C編程中對設計形式中適的配器形式的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!