适配器模式

什么是适配器?
举个例子,我们有些人买手机,买的是港版,会发现港版的电源插头跟我们的不一样,基本都是三角,而且它的三角还跟国内的不一样,导致我们必须用一个转换头才行。为了让港版电源插头在国内也能使用,就用转换头,这个转换头就是适配器。

适配器模式
适配器模式,就是连接两种不同种类的对象,使其毫无问题地协同工作。适配器的主要作用是把被适配者的行为传递给管道另一端的接收者。
第一种适配器,就是通过继承来适配两个接口。比如在Android中ListView的Adapter,就是典型的类适配器。要实现ListView的显示内容时,我们就会继承其BaseAdapter。IOS中也可以这样,通过继承超类,实现协议而达到多重继承的效果。
第二种适配器叫做对象适配器。不同的是,对象适配器不需要继承被适配者,而是一个对它的引用。而我们在IOS开发中最常见的就是delegate,delegate也被称为委托模式,在书《Objective-C编程之道 ios设计模式》中,delegate包含在适配器模式中。

委托delegate
我们在IOS开发过程中,最常见的就是delegate,比如需要实现UITableView的时候,我们会用到UITableViewDelegate。我们理理这个delegate。使用过程中,我们不需要知道UITableView中是如何调用这个delegate的,只需要在对应需要显示UITableView的地方实现UITableViewDelegate这个协议,而UITableView也不需要知道是如何实现具体的内容的。这样两者的关联通道仅仅是一个delegate而已。
接下来,用平时的代码来自定义一个delegate。

@protocol btnClickedDelegate 
//  定义了一个UITablViewCell中Button被点击的delegate
-(void)cellBtnClicked:(NSInteger)section row:(NSInteger)row;
@end

接着在Controller中实现了对应protocol

@interface TestViewController (){
        NSString *_cellIdentifier;
}
@end

@implementation NoviceGuideViewController
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    TestTableViewCell *cell = (TestTableViewCell *)[tableView dequeueReusableCellWithIdentifier:_cellIdentifier];
    cell.delegate = self; //传递delegate到cell中
    return cell;
}
- (void)cellBtnClicked:(NSInteger)section row:(NSInteger)row{
    // 省去实现的代码
}
@end

适配器实现了,那么就是被适配者的回调
.h文件

@interface TestTableViewCell : UITableViewCell
@property (weak, nonatomic) id delegate;
@end

.m文件

- (IBAction)buttonClick:(id)sender {
    if(self.delegate && [self.delegate respondsToSelector:@selector(cellBtnClicked:row:)]){
        [self.delegate cellBtnClicked:section row:row];
    }
}

这样,整个逻辑就完成了。
梳理一下执行流程:当cell中的按钮被点击的时候,会通过cell中的delegate,去调用cell中的引用,也就是Controller,然后controller中对对应的协议的实现,就是其后续的自己的逻辑流程了。

用Objective-C的块
如果我们将上面的delegate换成block就可以了。
只是有几个地方需要注意:
1、就是controller不在需要实现delegate了;
2、controller中直接声明block,传递给cell;
3、cell中仍然持有对block的引用;
4、cell中直接对block进行调用。

你可能感兴趣的:(适配器模式)