適配器模式:將一個類的接口轉(zhuǎn)換成客戶期望的接口。適配器讓原本可以不兼容的類可以適配無期
適配器模式是結(jié)構(gòu)型模式的一種,即通過改變某個已有類的接口實現(xiàn),來適配客戶相關(guān)邏輯和已有代碼不兼容的邏輯
我們經(jīng)常用的電腦大部分都是2口的插頭,如果一個環(huán)境下只有3口的插座,咋辦?
這個時候用一個3口的適配器插頭套上2頭的就好了,同樣在代碼邏輯中,如果客戶期望的接口和我們自己提供的接口不匹配怎么辦,通過適配器來偽裝一個期望的接口就完事了。
整體上來講適配器模式很簡單,不更多贅言

這里提到的適配器都是對象適配器,還有一種適配器叫類適配器,需要用到多繼承。iOS/Android(java)都不支持多繼承。
類適配器通過多繼承,讓適配器同時具備被適配對象和適配對象的能力。然后在讓被適配對象可以響應(yīng)適配對象的請求。

當(dāng)然在iOS中可以變通,通過協(xié)議和繼承,讓Adapper同時具有協(xié)議方法和被適配的方法。然后調(diào)用super;在Android/Java中通過繼承和接口也能實現(xiàn)類似的邏輯

舉個栗子
家里養(yǎng)了幾只家鴨,最近抓了幾只野雞。
本來鴨子和野雞不會在一起的,但是主人粗心關(guān)在了一起。
現(xiàn)在也需要野雞叫。
很顯然,鴨叫和野雞叫的方法并不相同。
調(diào)用鴨子和野雞叫的方法已經(jīng)實現(xiàn)了。
并且不能修改怎么辦?
很簡單,把野雞偽裝成家鴨即可。
鴨類的協(xié)議
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol Durk <NSObject>
-(void)quack;
@end
NS_ASSUME_NONNULL_END
鴨類的實現(xiàn)
#import "HomeDurk.h"
@implementation HomeDurk
- (void)quack {
NSLog(@"嘎嘎嘎?。?!");
}
@end
野雞的協(xié)議
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol Turkey <NSObject>
-(void)gobble;
@end
NS_ASSUME_NONNULL_END
野雞的實現(xiàn)
#import "WilrdTurkey.h"
@implementation WilrdTurkey
- (void)gobble {
NSLog(@"咕咕咕!??!");
}
@end
(野雞)的鴨適配器 實現(xiàn)鴨的協(xié)議
#import "DurkAdapter.h"
@interface DurkAdapter()
@property (nonatomic ,assign)id <Turkey> turkey;
@end
@implementation DurkAdapter
-(instancetype)initWithTurkey:(id<Turkey>)turkey {
if (self = [super init]) {
_turkey = turkey;
}return self;
}
-(void)quack {
[_turkey gobble];
}
@end
讓我們來聽鴨叫吧
#import <Foundation/Foundation.h>
#import "Durk.h"
#import "Turkey.h"
#import "DurkAdapter.h"
#import "WilrdTurkey.h"
#import "HomeDurk.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
HomeDurk * durk = [[HomeDurk alloc] init];
[durk quack];
//適配了鴨的火雞(讓火雞冒充鴨),可以調(diào)用鴨的方法
WilrdTurkey * turkey = [[WilrdTurkey alloc] init];
id<Durk> turkeyDurk = [[DurkAdapter alloc]initWithTurkey:turkey];
[turkeyDurk quack];
}
return 0;
}
優(yōu)點
1.解決不兼容的問題
2.提高了類的復(fù)用性
缺點
過多的使用適配器讓系統(tǒng)理解難度加大。