iOS设计模式 - 适配器
iOS设计模式 - 适配器
说明
1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信.
2. 本教程实现了适配器模式的类适配器与对象适配器两种模式,各有优缺点.
3. 如果对面向对象基本原理以及设计模式基本原理不熟悉,本教程会变得难以理解.
// // 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 的业务逻辑
此处的抽象是核心所在
如果我的内容能对你有所帮助,我就很开心啦!