首先先举个例子,在现实生活中每个国家的电压不一样,如果我们出去旅游没有电源适配器的话是根本无法充电的,但是我们会发现现在的情况都逐渐的消失了,因为充电器里面其实自带了这么一个电源适配器,这其实就是适配者模式的体现。适配器模式可以理解成连接两个不同种类的对象,让他们能够协同工作。
适配器模式有个解释如下将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。适配器模式中有三个概念我们也需要知道的就是适配者,适配器以及目标者。目标者就是最终我们需要的,适配器就是把不兼容的变成兼容的,适配者就是需要被适配的对象。
适配者适配器模式的优点的话其实是可以解耦合的,就比如说我们在ios中去加载cell的时候就有可能会出现来源的模型不同,这样就会出现多个模型,如果我们在Cell里面去判断是哪个哪个模型的话,耦合性太高,并且在cell中代码量太多,所以我们就可以考虑用适配器模式来做事情。
使用的场景:1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类协同工作 ,其实也就是说当我们要做新功能的时候要复用之前我们已经写好的类,但是可能这个新接口和我们的类是不兼容的,也就是说我们要去兼容的话,就得去修改现有的类,但是这个时候出现了适配器,所以我们可以利用适配器模式的思想去解决它。
适配器模式大致分为类适配器模式和对象适配器模式
类适配器模式的话其实就是当客户在接口中定义了它期望的行为时,我们去定义一个接口,通过创建继承被适配者的类,去提供一个实现该接口的类,用继承的关系来实现适配。
对象适配器的话,就是适配器里面引用一个适配者的实例,然后再通过接口扩展方法。
下面举个例子来说明两者之间的区别
首先是类适配器模式就拿汇率转换的问题来说,如果我们现在有两种货币,一种是人民币,一种是美元,这样的话,我们想让美元能适配人民币也就是说想让美元能转成人民币,完成一个转换的问题。这个时候美元就是一个被适配者,人民币是目标者,然后我们需要去创建一个适配器。
首先创建一个美元类
#import <UIKit/UIKit.h>
@interface AdapteeDollar : NSObject
-(CGFloat)getDollar;
@end
实现方法
#import "AdapteeDollar.h"
@implementation AdapteeDollar
-(CGFloat)getDollar
{
return 100;
}
@end
创建目标接口
//目标接口
#import <UIKit/UIKit.h>
@protocol TargetProtocol <NSObject>
//转换人民币
-(CGFloat)changeRMB;
@end
创建适配器继承自美元类遵守协议
#import "AdapteeDollar.h"
#import "TargetProtocol.h"
@interface AdapterCurrency : AdapteeDollar<TargetProtocol>
@end
实现方法,实现目标接口的方法
#import "AdapterCurrency.h"
@implementation AdapterCurrency
- (CGFloat)changeRMB {
CGFloat count = [self getDollar];
CGFloat total = count*7;
return total;
}
@end
如果是对象适配器模式的话基本差不多,差别就在于适配器类不再是继承被适配者了,而是拥有被适配者。其实适配器就是作为一个中间层去转换这些操作。
桥接模式和适配器模式的区别就在于适配器模式是为了兼容改变原有的接口,一般用于组件之间的适配啊,音视频和SDK和我们的代码的适配。
如果是桥接模式主要做的就是让抽象化和实例化分离,可以独立改变。
在ios开发中其实UITableView这个类的实现就用到了适配器模式,因为只要我控制器遵循了这个代理协议就可以去实现方法去设置数据,然后展示到UI上,其实就好比我控制器是一个适配器,数据是一个适配者,而协议就是目标者。其实就是要把我们的数据变成去兼容能够让tableView去使用。可以这么去理解。
具体用法有两篇文章可以参考:http://www.jianshu.com/p/1ab681c90551
http://www.jianshu.com/p/6f6585820537