適配器模式
創建適配協議,創建抽象適配器類,創建類適配器/對象適配器。應用,適用場景
電源適配器,普通充電器(類適配器),蘋果設備充電器(對象適配器)。輸入電壓,輸出電壓。
適配器協議
//
// 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以前的代碼,進行適當的改進。