iOS 適配器模式

  • 適配器模式
    創建適配協議,創建抽象適配器類,創建類適配器/對象適配器。

  • 應用,適用場景
    電源適配器,普通充電器(類適配器),蘋果設備充電器(對象適配器)。輸入電壓,輸出電壓。

適配器協議

//
//  AdapterProtocol.h
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/2.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol AdapterProtocol <NSObject>

- (NSString *)name;
- (UIColor *)lineColor;
- (NSString *)phoneNumber;

@end

抽象適配器

//
//  Adapter.h
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/2.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "AdapterProtocol.h"

@interface Adapter : NSObject<AdapterProtocol>

///輸入對象
@property (weak, nonatomic) id data;

///與輸入對象建立聯系
- (instancetype)initWithData:(id)data;

@end
//
//  Adapter.m
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/2.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import "Adapter.h"

@implementation Adapter

- (instancetype)initWithData:(id)data {
    self = [super init];
    if (self) {
        self.data = data;
    }
    return self;
}

- (NSString *)name {
    return nil;
}

- (UIColor *)lineColor {
    return nil;
}

- (NSString *)phoneNumber {
    return nil;
}

@end

類適配器(ModelAdapter)

//
//  Model.h
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/2.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface Model : NSObject

///名字
@property (retain, nonatomic) NSString *name;
///線條顏色
@property (retain, nonatomic) UIColor *lineColor;
///電話號碼
@property (retain, nonatomic) NSString *phoneNumber;

@end
//
//  ModelAdapter.h
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/3.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import "Adapter.h"

@interface ModelAdapter : Adapter

@end
//
//  ModelAdapter.m
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/3.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import "ModelAdapter.h"
#import "Model.h"

@implementation ModelAdapter

- (instancetype)initWithData:(id)data {
    self = [super init];
    if (self) {
        self.data = data;
    }
    return self;
}

- (NSString *)name {
    Model *data = self.data;
    return data.name;
}

- (UIColor *)lineColor {
    Model *data = self.data;
    return data.lineColor;
}

- (NSString *)phoneNumber {
    Model *data = self.data;
    return data.phoneNumber;
}

@end

類適配器(NewModelAdapter)

//
//  NewModel.h
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/2.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NewModel : NSObject

///名字
@property (retain, nonatomic) NSString *name;
///線條顏色
@property (retain, nonatomic) NSString *lineColorHexString;
///電話號碼
@property (retain, nonatomic) NSString *phoneNumber;

@end
//
//  NewModelAdapter.h
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/3.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import "Adapter.h"

@interface NewModelAdapter : Adapter

@end
//
//  NewModelAdapter.m
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/3.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import "NewModelAdapter.h"
#import "NewModel.h"

@implementation NewModelAdapter

- (instancetype)initWithData:(id)data {
    self = [super init];
    if (self) {
        self.data = data;
    }
    return self;
}

- (NSString *)name {
    NewModel *data = self.data;
    return data.name;
}

- (UIColor *)lineColor {
    NewModel *data = self.data;
    //todo 簡化
    UIColor *color = nil;
    if ([data.lineColorHexString isEqualToString:@"black"]) {
        color = [UIColor blackColor];
    }
    else {
        color = [UIColor redColor];
    }
    return color;
}

- (NSString *)phoneNumber {
    NewModel *data = self.data;
    return data.phoneNumber;
}

@end

對象適配器(ObjectAdapter)

//
//  ObjectAdapter.h
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/3.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import "Adapter.h"

@interface ObjectAdapter : Adapter

@end
//
//  ObjectAdapter.m
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/3.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import "ObjectAdapter.h"
#import "Model.h"
#import "NewModel.h"

@implementation ObjectAdapter

- (instancetype)initWithData:(id)data {
    self = [super init];
    if (self) {
        self.data = data;
    }
    return self;
}

- (NSString *)name {
    if ([self.data isMemberOfClass:[Model class]]) {
        Model *data = self.data;
        return data.name;
    }
    else if ([self.data isMemberOfClass:[NewModel class]]) {
        NewModel *data = self.data;
        return data.name;
    }
    else {
        return nil;
    }
}

- (UIColor *)lineColor {
    if ([self.data isMemberOfClass:[Model class]]) {
        Model *data = self.data;
        return data.lineColor;
    }
    else if ([self.data isMemberOfClass:[NewModel class]]) {
        NewModel *data = self.data;
        UIColor *color = nil;
        if ([data.lineColorHexString isEqualToString:@"black"]) {
            color = [UIColor blackColor];
        }
        else {
            color = [UIColor redColor];
        }
        return color;
    }
    else {
        return nil;
    }
}

- (NSString *)phoneNumber {
    if ([self.data isMemberOfClass:[Model class]]) {
        Model *model = self.data;
        return model.phoneNumber;
    }
    else if ([self.data isMemberOfClass:[NewModel class]]) {
        NewModel *model = self.data;
        return model.phoneNumber;
    }
    else {
        return nil;
    }
}

@end

使用

//
//  ViewController.m
//  LearnAdapter
//
//  Created by 印林泉 on 2017/3/2.
//  Copyright ? 2017年 yiq. All rights reserved.
//

#import "ViewController.h"
#import "View.h"
#import "Model.h"
#import "ModelAdapter.h"
#import "NewModel.h"
#import "NewModelAdapter.h"

#import "ObjectAdapter.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self classAdapter];
    [self objectAdapter];
}

- (void)classAdapter {
    View *view = [[View alloc] initWithFrame:VIEW_FRAME];
    
    Model *model = [[Model alloc] init];
    model.name = @"yinlinqvan";
    model.lineColor = [UIColor redColor];
    model.phoneNumber = @"18721409352";
    
    NewModel *newModel = [[NewModel alloc] init];
    newModel.name = @"linda";
    newModel.lineColorHexString = @"black";
    newModel.phoneNumber = @"18721409352";
    
    ///與輸入建立聯系
    Adapter *modelAdapter = [[ModelAdapter alloc] initWithData:model];
    //Adapter *modelAdapter = [[NewModelAdapter alloc] initWithData:newModel];
    ///與輸出建立聯系
    [view loadData:modelAdapter];
    [self.view addSubview:view];
}

- (void)objectAdapter {
    View *view = [[View alloc] initWithFrame:VIEW_FRAME_2];
    
    Model *model = [[Model alloc] init];
    model.name = @"linda";
    model.lineColor = [UIColor redColor];
    model.phoneNumber = @"18721409352";
    
    NewModel *newModel = [[NewModel alloc] init];
    newModel.name = @"linda";
    newModel.lineColorHexString = @"black";
    newModel.phoneNumber = @"18721409352";
    
    ///與輸入建立聯系
    //Adapter *modelAdapter = [[ObjectAdapter alloc] initWithData:model];
    Adapter *modelAdapter = [[ObjectAdapter alloc] initWithData:newModel];
    ///與輸出建立聯系
    [view loadData:modelAdapter];
    [self.view addSubview:view];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

review以前的代碼,進行適當的改進。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容