iOS设计模式 - 适配器
效果
说明
1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信.
2. 本教程实现了适配器模式的类适配器与对象适配器两种模式,各有优缺点.
3. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解.
源码
https://github.com/YouXianMing/iOS-Design-Patterns
//
// BusinessCardView.h
// Adapter
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "BusinessCardAdapterProtocol.h"
#define BUSINESS_FRAME CGRectMake(0, 0, 200, 130)
@interface BusinessCardView : UIView
/**
* 名字
*/
@property (nonatomic, strong) NSString *name;
/**
* 线条颜色
*/
@property (nonatomic, strong) UIColor *lineColor;
/**
* 电话号码
*/
@property (nonatomic, strong) NSString *phoneNumber;
/**
* 加载数据(实现了BusinessCardAdapterProtocol协议的数据)
*
* @param data 实现了BusinessCardAdapterProtocol协议的数据
*/
- (void)loadData:(id <BusinessCardAdapterProtocol>)data;
@end
//
// BusinessCardView.m
// Adapter
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import "BusinessCardView.h"
@interface BusinessCardView ()
@property (nonatomic, strong) UILabel *nameLabel;
@property (nonatomic, strong) UIView *lineView;
@property (nonatomic, strong) UILabel *phoneNumberLabel;
@end
@implementation BusinessCardView
#pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (void)setup {
self.backgroundColor = [UIColor whiteColor];
self.layer.borderWidth = 0.5f;
self.layer.shadowOpacity = 0.5f;
self.layer.shadowOffset = CGSizeMake(5, 5);
self.layer.shadowRadius = 1.f;
self.layer.shadowColor = [UIColor grayColor].CGColor;
self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, 150, 25)];
self.nameLabel.font = [UIFont fontWithName:@"Avenir-Light" size:20.f];
[self addSubview:self.nameLabel];
self.lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 45, 200, 5)];
[self addSubview:self.lineView];
self.phoneNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(41, 105, 150, 20)];
self.phoneNumberLabel.textAlignment = NSTextAlignmentRight;
self.phoneNumberLabel.font = [UIFont fontWithName:@"AvenirNext-UltraLightItalic" size:16.f];
[self addSubview:self.phoneNumberLabel];
}
- (void)loadData:(id <BusinessCardAdapterProtocol>)data {
self.name = [data name];
self.lineColor = [data lineColor];
self.phoneNumber = [data phoneNumber];
}
#pragma mark - 重写setter,getter方法
@synthesize name = _name;
@synthesize lineColor = _lineColor;
@synthesize phoneNumber = _phoneNumber;
- (void)setName:(NSString *)name {
_name = name;
_nameLabel.text = name;
}
- (NSString *)name {
return _name;
}
- (void)setLineColor:(UIColor *)lineColor {
_lineColor = lineColor;
_lineView.backgroundColor = _lineColor;
}
- (UIColor *)lineColor {
return _lineColor;
}
- (void)setPhoneNumber:(NSString *)phoneNumber {
_phoneNumber = phoneNumber;
_phoneNumberLabel.text = phoneNumber;
}
- (NSString *)phoneNumber {
return _phoneNumber;
}
@end
//
// BusinessCardAdapter.h
// NormalProblem
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "BusinessCardAdapterProtocol.h"
@interface BusinessCardAdapter : NSObject <BusinessCardAdapterProtocol>
/**
* 输入对象
*/
@property (nonatomic, weak) id data;
/**
* 与输入对象建立联系
*
* @param data 输入的对象
*
* @return 实例对象
*/
- (instancetype)initWithData:(id)data;
@end
//
// BusinessCardAdapter.m
// NormalProblem
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import "BusinessCardAdapter.h"
@implementation BusinessCardAdapter
- (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
//
// BusinessCardAdapterProtocol.h
// NormalProblem
//
// Created by YouXianMing on 15/7/25.
// Copyright (c) 2015年 YouXianMing. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol BusinessCardAdapterProtocol <NSObject>
- (NSString *)name;
- (UIColor *)lineColor;
- (NSString *)phoneNumber;
@end
分析
这是基于BusinessCardView构建出来的必不可少的抽象适配器以及一个协议,通过继承抽象适配器来实现具体的适配器,协议是用来统一接口.
对象适配器与类适配器.
客户端(BusinessCardView)只与适配器进行通信,它不关心数据源 NormalModel 与 SpecialModel 的业务逻辑
此处的抽象是核心所在