设计模式-适配器

定义:有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

角色

  • Target:目标抽象类
  • Adapter:适配器类
  • Adaptee:适配者类
  • Client:客户类

类图:

实例:
比如iPhone的手机卡是特别小的Nano卡,把Nano卡拿到的其他手机上不能贴合卡槽尺寸,所以我们需要加一个复合卡槽尺寸的卡套

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 标准卡 尺寸协议
@protocol StandardSIMSizeProtocol <NSObject>

- (void)normalSize;

@end

// Nano卡 尺寸协议
@protocol NanoSIMSizeProtocal <NSObject>

- (void)nanoSize;

@end


// Nano 卡套(Adapter)
@interface NanoAdapter : SIMCard <StandardSIMSizeProtocol>

@property (nonatomic, strong) NanoSIMCard *nanoSIMCard;

@end

@implementation NanoAdapter

- (void)normalSize{}

@end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 一部手机
@interface NormalPhone : Phone

- (void)setSimCard:(SIMCard *)simCard;

@end

@implementation NormalPhone

- (void)setSimCard:(SIMCard *)simCard
{
[simCard normalSize];
}

@end
1
2
3
4
5
6
7
8
9
10
11
// 标准卡不需要适配器
StandardSIMCard *standardCard = [StandardSIMCard new];
NormalPhone *phone = [NormalPhone new];
[phone setSimCard:standardCard];

// 但是由于普通的手机卡并不能直接安装Nano卡,因此需要加一个卡套
// Nano卡需要一个适配器
NanoSIMCard *nanoCard = [NanoSIMCard new];
NanoAdapter *nanoAdapter = [NanoAdapter new];
nanoAdapter.nanoSIMCard = nanoCard;
[phone setSimCard:nanoAdapter];

实例角色:

Target:目标抽象类 Adapter:适配器类 Adaptee:适配者类 Client:客户类
SIMCard NanoAdapter NanoSIMCard NormalPhone

优点:

  • 适配器不需要改变现有的类,提高类的复用性
  • 目标类和适配器类解耦, 提高扩展性,完全符合“开闭原则”

缺点:

  • 增加了系统的复杂性

成功案例

  • JDBC

总结:

  • 在两套系统都比较复杂的情况下,可通过适配器做适配,影响较小