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類適配器
類適配器中適配器與被適配者是繼承關(guān)系
3.2對象適配器
對象適配器中適配器與被適配者是組合關(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)整即可伟桅。
以上為本人個人理解與分享,如有錯誤歡迎指出??