iOS設(shè)計模式之美-適配器模式

Adapter.png

iOS設(shè)計模式之美-工廠模式
iOS設(shè)計模式之美-抽象工廠模式
iOS設(shè)計模式之美-生成器模式
iOS設(shè)計模式之美-適配器模式

1.何為適配器模式

將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口遍蟋,適配器模式使得原本由于接口不兼容而不能一起工作的哪些類可以一起工作

適配器模式你可能不了解,但電源適配器你總有點熟悉吧螟凭?對虚青,就是那個iPhone手機充電器那個方形的頭,上面有一段描述為 輸入:100-240V 螺男。這什么意思呢棒厘?其實每個國家電源電壓都是有差異的,中國為220V下隧,日本100V奢人,其它一些歐洲國家為110V。如果沒有電源適配器淆院,我們的手機將無法正常充電何乎。我們是重新購買合適的充電器呢?還是要求每個國家都提供各種不同電壓的電源呢?明顯上述兩種方法都不合適與不合理宪赶。于是適配器便應(yīng)運而生了宗弯,為我們在不同環(huán)境下不同電壓提供了一個中轉(zhuǎn)的作用脯燃,將其轉(zhuǎn)換成合適我們當(dāng)前充電器適合的電壓搂妻。

2.何時使用適配器模式

  • 已有類的接口與需求不匹配(電源電壓不合適)
  • 想要一個可復(fù)用的類,該類能夠同可能帶有不兼容接口的其他類協(xié)作(想要個能在各種不同電壓環(huán)境下充電的萬能充電器)
  • 需要適配一個類的幾個不同的子類辕棚,可是讓每個子類去子類化一個類適配器又不現(xiàn)實(針對不同電壓環(huán)境下生產(chǎn)不同類型的充電器十分麻煩并且不現(xiàn)實)

3.適配器模式靜態(tài)類結(jié)構(gòu)圖

適配器模式又分為 類適配器對象適配器

  • Client:使用者(iPhone)
  • <Target>:目標(biāo)需求接口(iPhone統(tǒng)一需要的電壓要求)
  • Adapter:適配器(電源適配器)
  • Adaptee:被適配者(不同環(huán)境下的電壓)
3.1類適配器
類適配器.png

類適配器中適配器與被適配者是繼承關(guān)系

3.2對象適配器
對象適配器.png

對象適配器中適配器與被適配者是組合關(guān)系

4.類配器與對象適配器的區(qū)別

類適配 對象適配器
只針對單一具體的Adaptee類欲主,把Adaptee適配到<Target> 可以適配多個Adaptee及其子類
易于重載Adaptee的行為,因為是通過直接的子類化進行適配 難以重載Adaptee的行為逝嚎,需要借助于子類的對象而不是Adaptee本身
只有一個Adaptee對象扁瓢,無需額外的的指針間接訪問Adaptee 需要額外的指針以間接訪問Adaptee并適配其行為

5.案例

上述電源適配器為對象適配器,所以下面代碼將以如何實現(xiàn)對象適配器為例

WCQRecharge.h

//定義標(biāo)準(zhǔn)輸出電壓協(xié)議接口
#import <Foundation/Foundation.h>

@protocol WCQRecharge <NSObject>

- (void)recharge;

@end

WCQRechargeAdapter.h

//定義可轉(zhuǎn)換任意電壓且提供標(biāo)準(zhǔn)電壓輸出協(xié)議的電源適配器
#import <Foundation/Foundation.h>
#import "WCQRecharge.h"

@interface WCQRechargeAdapter : NSObject<WCQRecharge>

- (instancetype)initWithTension:(id)tension;

@end

WCQRechargeAdapter.m

#import "WCQRechargeAdapter.h"
#import "WCQ110VTension.h"
#import "WCQ220VTension.h"

@interface WCQRechargeAdapter ()

@property (nonatomic, strong) id tension;

@end

@implementation WCQRechargeAdapter

- (instancetype)initWithTension:(id)tension {
    
    if (self = [super init]) {
        
        _tension = tension;
    }
    return self;
}

- (void)recharge {
    
    if ([_tension isMemberOfClass:[WCQ220VTension class]]) {
        
        [_tension tensionOf220V];
    }else if ([_tension isMemberOfClass:[WCQ110VTension class]]) {
        
        [_tension tensionOf110V];
    }
}


@end

WCQ220VTension.h

//定義需要轉(zhuǎn)換的電壓
#import <Foundation/Foundation.h>

@interface WCQ220VTension : NSObject

- (void)tensionOf220V;

@end

WCQ220VTension.m

#import "WCQ220VTension.h"

@implementation WCQ220VTension

- (void)tensionOf220V {
    
    NSLog(@"220V");
}

@end

110V電壓同理這里不貼了......

客戶端(iPhone)調(diào)用代碼示例:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    id tension = [[WCQ110VTension alloc] init];
    WCQRechargeAdapter *rechargeAdapter =  [[WCQRechargeAdapter alloc] initWithTension:tension];
    [rechargeAdapter recharge];
}

這里我們能夠看到在使用同一個電源適配器的情況下补君,即使將tension換成WCQ220VTension進行初始化引几,同樣能滿足用戶的充電需求。同時適配器模式在對原有系統(tǒng)或第三方類庫接口變更上也能做到很好的兼容挽铁,我們只需在所使用的適配器類中進行相應(yīng)的調(diào)整即可伟桅。


以上為本人個人理解與分享,如有錯誤歡迎指出??


recharge.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叽掘,一起剝皮案震驚了整個濱河市楣铁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌更扁,老刑警劉巖盖腕,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浓镜,居然都是意外死亡溃列,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門膛薛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來听隐,“玉大人,你說我怎么就攤上這事相叁∽翊拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵增淹,是天一觀的道長椿访。 經(jīng)常有香客問我,道長虑润,這世上最難降的妖魔是什么成玫? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上哭当,老公的妹妹穿的比我還像新娘猪腕。我一直安慰自己,他們只是感情好钦勘,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布陋葡。 她就那樣靜靜地躺著,像睡著了一般彻采。 火紅的嫁衣襯著肌膚如雪腐缤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天肛响,我揣著相機與錄音岭粤,去河邊找鬼。 笑死特笋,一個胖子當(dāng)著我的面吹牛剃浇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猎物,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼虎囚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了霸奕?” 一聲冷哼從身側(cè)響起溜宽,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎质帅,沒想到半個月后适揉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡煤惩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年嫉嘀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魄揉。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡剪侮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洛退,到底是詐尸還是另有隱情瓣俯,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布兵怯,位于F島的核電站彩匕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏媒区。R本人自食惡果不足惜驼仪,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一掸犬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绪爸,春花似錦湾碎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仇味,卻和暖如春呻顽,著一層夾襖步出監(jiān)牢的瞬間雹顺,已是汗流浹背丹墨。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嬉愧,地道東北人贩挣。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像没酣,于是被迫代替她去往敵國和親王财。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345