架构设计基础

适配器模式

2019-03-25  本文已影响0人  架构师的一小步
什么是适配器模式?

第一点:将一个原始接口转成客户端需要的接口
原始接口--相当于: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)
专门搞一帮人写事件处理

上一篇下一篇

猜你喜欢

热点阅读