iOS設計模式之美-適配器模式

Adapter.png

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

1.何為適配器模式

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

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

2.何時使用適配器模式

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

3.適配器模式靜態(tài)類結構圖

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

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

類適配器中適配器與被適配者是繼承關系

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

對象適配器中適配器與被適配者是組合關系

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

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

5.案例

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

WCQRecharge.h

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

@protocol WCQRecharge <NSObject>

- (void)recharge;

@end

WCQRechargeAdapter.h

//定義可轉(zhuǎ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)或第三方類庫接口變更上也能做到很好的兼容,我們只需在所使用的適配器類中進行相應的調(diào)整即可。


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


recharge.png
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容