适配器模式
什么是适配器模式?
第一点:将一个原始接口转成客户端需要的接口
原始接口--相当于:Adaptee
客户端需要接口(调用者)---相当于:Target
第二点:原始接口不兼容现在新的接口,将他们两个可以一起工作
一起工作需要Adapter实现
适配器模式-应用场景?
第一点:接口不兼容
第二点:可以重复使用的类,用于与一些彼此没有太大关联的一些类一起工作
第三点:统一输出接口,输入端类型无法确定
适配器模式-角色划分?
3个核心角色
角色一:适配器(核心)
角色二:目标接口
角色三:被适配者
实际开发中
UITableView
设计思想->适配器模式
角色一:适配器->ViewController(实现协议->两个delegate)
角色二:目标接口->UI界面(抽象)->UITableView(Cell)
角色三:被适配者->数据(UserModel…)
问题来了?
发现问题:如果你把ViewComtroller作为适配器的话,那么会出现类代码臃肿?
写了代码:更新UI、适配UI、处理逻辑…
解决方案:通过适配器模式优化代码结构,解决类代码臃肿问题?
适配器模式-原理案例?
基本结构学习明白
适配器模式分为两种
第一种:类适配器
通过案例分析?
金额转换->1000USA->适配->人民币6500
适配器:Adapter(适配器)
//
// Adapter.h
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Target.h"
#import "Adaptee.h"
//类适配器
//适配器:Adapter
//特点一:实现协议(目标接口)
//特点二:适配器继承被适配者
@interface Adapter : Adaptee<Target>
@end
//
// Adapter.m
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import "Adapter.h"
@implementation Adapter
-(float)getRMB{
return [self getUSA] * 6.5;
}
@end
目标接口:Target
//
// Target.h
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import <Foundation/Foundation.h>
//类适配器->实现
//目标接口
@protocol Target<NSObject>
-(float)getRMB;
@end
被适配者:Adaptee
//
// Adaptee.h
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import <Foundation/Foundation.h>
//被适配者:Adaptee
@interface Adaptee : NSObject
-(float)getUSA;
@end
//
// Adaptee.m
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import "Adaptee.h"
@implementation Adaptee
-(float)getUSA{
return 1000;
}
@end
第二种:对象适配器
通过案例分析?
金额转换->1000USA->适配->人民币6500
适配器:Adapter(适配器)
//
// ObjectAdapter.h
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Target.h"
#import "Adaptee.h"
//对象适配器
//两个特点
//特点一:实现协议
//特点二:持有被适配者引用
@interface ObjectAdapter : NSObject<Target>
- (instancetype)init:(Adaptee*)adaptee;
@end
//
// ObjectAdapter.m
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import "ObjectAdapter.h"
@interface ObjectAdapter()
@property(nonatomic, strong)Adaptee* adaptee;
@end
@implementation ObjectAdapter
- (instancetype)init:(Adaptee*)adaptee{
self = [super init];
if (self) {
self.adaptee = adaptee;
}
return self;
}
-(float)getRMB{
return [self.adaptee getUSA] * 6.5;
}
@end
目标接口:Target
被适配者:Adaptee
适配器模式-开发案例?
设计思想->适配器模式 适配UITableview
角色一:适配器->ViewController(实现协议->两个delegate)
角色二:目标接口->UI界面(抽象)->UITableView(Cell)
<UITableViewDelegate, UITableViewDataSource>
//
// BaseAdapter.h
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import <UIKit/UIKit.h>
//角色一:适配器->BaseAdapter
//特点一:实现目标接口(协议)->UI
@interface BaseAdapter : NSObject<UITableViewDelegate, UITableViewDataSource>
//万能类型
@property(nonatomic, strong) NSMutableArray* dataArray;
@end
//
// BaseAdapter.m
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import "BaseAdapter.h"
@implementation BaseAdapter
- (instancetype)init{
self = [super init];
if (self) {
_dataArray = [[NSMutableArray alloc] init];
}
return self;
}
//提供默认实现
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
//提供默认实现
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectio{
return _dataArray.count;
}
//提供默认实现
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString * showUserInfoCellIdentifier = @"userInfoCell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:showUserInfoCellIdentifier];
if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:showUserInfoCellIdentifier];
}
cell.textLabel.text = @"姓名";
cell.detailTextLabel.text = @"Dream";
return cell;
}
@end
//
// UesrAdapter.h
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import "BaseAdapter.h"
@interface UesrAdapter : BaseAdapter
@end
//
// UesrAdapter.m
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import "UesrAdapter.h"
#import "UserModel.h"
@implementation UesrAdapter
- (instancetype)init{
self = [super init];
if (self) {
//从网络获取数据
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
[self.dataArray addObject:[[UserModel alloc] init:@"很帅气" name:@"Dream"]];
}
return self;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return [super numberOfSectionsInTableView:tableView];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell* cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
UserModel* user = [self.dataArray objectAtIndex:indexPath.row];
cell.textLabel.text = user.title;
cell.detailTextLabel.text = user.name;
return cell;
}
@end
角色三:被适配者->数据(UserModel…)
//
// UserModel.h
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface UserModel : NSObject
@property(nonatomic, copy) NSString* title;
@property(nonatomic, copy) NSString* name;
- (instancetype)init:(NSString*)title name:(NSString*)name;
@end
//
// UserModel.m
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import "UserModel.h"
@implementation UserModel
- (instancetype)init:(NSString*)title name:(NSString*)name{
self = [super init];
if (self) {
_name = name;
_title = title;
}
return self;
}
@end
调用
//
// ViewController.m
// Dream_20180701_Adapter
//
// Created by Dream on 2018/7/1.
// Copyright © 2018年 Tz. All rights reserved.
//
#import "ViewController.h"
#import "UesrAdapter.h"
//适配器->ViewController
//目标接口->UI界面(UITableView、UITableViewCell...)
//被适配者->数据
@interface ViewController ()
//RefreshUITableView
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property(nonatomic)UesrAdapter* adapter;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initAdapter];
}
-(void)initAdapter{
//里面用到项目中,立即使用(里面可以优化你的代码结构)
_adapter = [[UesrAdapter alloc] init];
_tableView.delegate = _adapter;
_tableView.dataSource = _adapter;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
原始代码
适配器模式优化?
抽象->达到复用目的(重用目的)
角色分析?
角色一:适配器->BaseAdapter
代替ViewController功能
专门搞一帮人写adapter
交互->协议(代理->block)
专门搞一帮人写事件处理