適配器模式(Adepter Pattern)

適配器模式:將一個類的接口轉(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)類似的邏輯

iOS中的類適配器

舉個栗子
家里養(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)理解難度加大。

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

相關(guān)閱讀更多精彩內(nèi)容

  • 幾年前我就知道了梭羅,我總聽別人提起他,仿佛他還在這個世上努力地生活著。在閱讀他的書籍之前我模糊地認(rèn)識到他是一個熱...
    姚自在閱讀 891評論 0 4
  • 我從來沒有想過 我到最后會開始屏蔽這些人 可能是因為我不是圣人 可能因為我是個壞人 可是我又想做個過好自己生活的好...
    貓哥閱讀 317評論 0 0
  • 昨天參與了一次商業(yè)會談,了解了目前的開發(fā)現(xiàn)狀。 中國電信NB-IoT網(wǎng)絡(luò)依然覆蓋率最好; 中國電信會過濾重復(fù)上發(fā)的...
    小魚兒他老漢閱讀 489評論 0 0
  • 說說我今天的想法吧,雖然成為教書匠四年,但是關(guān)于教案方面的,還是有很多地方理解得不透徹。這篇文章,我上過,也看過名...
    M橘子閱讀 134評論 0 1

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