适配两个不兼容的接口
将A接口转换成B接口
事例
需求:桔子包装用光了,想要用苹果包装来代替桔子包装。即AppleBag转换成OrangeBag
结构如图
目标类(桔子包装):
public class OrangeBag implements Bag {
@Override
public void pack() {
System.out.println("orange bag pack");
}
}
源类(苹果包装):
public class AppleBag implements Bag {
@Override
public void pack() {
System.out.println("apple bag pack");
}
}
适配器类:
适配器类要extends目标类,这样才能代替目标类
public class OrangeBagAdapter extends OrangeBag {
private AppleBag mAppleBag;
public OrangeBagAdapter(AppleBag appleBag) {
mAppleBag = appleBag;
}
@Override
public void pack() {
mAppleBag.pack();
}
}
测试:
public void adaptBag() {
AppleBag appleBag = new AppleBag();
// 将AppleBag适配成OrangeBag
OrangeBag orangeBag = new OrangeBagAdapter(appleBag);
orangeBag.pack();
}
适配器的分类
- 对象适配器:以组合(持有)的方式得到源类
- 类适配器:以继承的方式成为源类
上面事例中的适配器持有了AppleBag对象,所以就是对象适配器
若AppleBag是接口,适配器去实现AppleBag,则就是类适配器
三个角色
- 目标类:客户所需的接口
- 源类(适配者类):要被转换的接口
- 适配器类:extends/implements目标类,为目标类提供实例
总结
适用场景
当已有两个不兼容的接口,想让它们兼容工作时
优点
- 将目标类与源类解耦,适配器来完成转换的工作,无需修改原有代码
- 提高源类的复用性
- 提高系统灵活性和扩展性,新增适配器即可
缺点
- 使用适配器模式过多,会破坏系统结构、降低代码可读性