
https://blog.youkuaiyun.com/treasureqian/article/details/103583635
1.简介
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
2.分类
适配器模式属于结构型模式。
分为两类,对象适配器模式和类适配器模式。
最简单的比喻就是 android插口转Type C插口,香港电源适配器
1)对象适配器
在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
2)类适配器模式
这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
3.简单的代码示例
(220V 转 5V)
1)创建适配器接口
public interface Adapter {
int convertTo5V();
}
2)创建需要转换的对象
public class Electric {
public int output220V() {
return 220;
}
}
3)创建具体的适配器
@1 对象适配器模式
public class PhoneAdapter implements Adapter {
private Electric electric;
public PhoneAdapter(Electric electric) {
this.electric = electric;
}
@Override
public int convertTo5V() {
Log.d(TAG, "适配器开始工作: ");
Log.d(TAG, "输入电压: " + electric.output220V());
Log.d(TAG, "输出电压:" + 5);
return 5;
}
}
@2 类适配器模式
public class PhoneClassAdapter extends Electric implements Adapter{
@Override
public int convertTo5V() {
Log.d(TAG, "适配器开始工作: ");
Log.d(TAG, "输入电压: " + output220V());
Log.d(TAG, "输出电压:" + 5);
return 5;
}
}
二者的区别:一个是传入对象 一个是以子类方式去继承
4)去调用
前者为对象适配器调用 后者为类适配器模式
public void init() {
Electric electric = new Electric();
PhoneAdapter phoneAdapter = new PhoneAdapter(electric);
phoneAdapter.convertTo5V();
System.out.println(MainActivity.TAG + "--------------------------------------------");
PhoneClassAdapter phoneClassAdapter = new PhoneClassAdapter();
phoneClassAdapter.convertTo5V();
}
结果
5)比较
- 类适配器采用了继承的方式来实现;而对象适配器是通过传递对象来实现,这是一种组合的方式
- 适配器通过继承都获得了父类的方法,客户端使用时都会把这些方法暴露出去,增加了一定的使用成本;对象适配器则不会。
- 类适配器只能适配他的父类,这个父类的其他子类都不能适配到;而对象适配器可以适配不同的对象,只要这个对象的类型是同样的。
- 类适配器不需要额外的引用;对象适配器需要额外的引用来保存对象。
4.使用场景以及优缺点
- 当想使用一个已经存在的类,但它的接口不符合需求时。
- 当想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
- 提高了类的复用性,提高了类的灵活性(不同适配器不同功能),符合开闭原则,不修改原有的类
- 过多的使用适配器,会让系统非常零乱,不易整体进行把握。明明调用A接口,却被适配成B接口。