定义
适配器模式(Adapter Pattern):
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
译:将一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
类图
来解释一下这个图片:
适配器模式分为类适配模式(图1)和对象适配模式(图2)。
通过图来看,第一个是继承的方式,第二个是依赖组合的方式。
作用都是将Adaptee源类经过Adapter类,改装成Target能够识别的接口。实例代码稍后添加~
除了这两种外,Android里面还有ListView的Adapter,或者IOS的UITableView里面的datasource,而这种模式也是适配器模式,这种是将无数中输入转化成约束好的接口输出。代码也在后面附上~
使用场景
接口不兼容,类似三头没法插在两头插座上一样,需要一个转换器
统一的输出接口,而输入多种多样,类似上面的ListView 的Adapter
用于关联一些关系不大的类。
实现方式
类适配模式,继承的方式
//Target
public interface TwoPlug {
public int getTwoPlug();
}
//Adaptee
public class ThreePlug {
public int getThreePlug() {
return 3;
}
}
// Adapter
public class ThreeToTwoAdapter extends ThreePlug implements TwoPlug {
@Override
public int getTwoPlug() {
return changeToTwo();
}
private int changeToTwo() {
int originalPlug = getThreePlug();
// 只接两根线,不使用接地线,对接!!
return 2;
}
}
public static void main(String[] args) {
int plugin = new ThreeToTwoAdapter().getThreePlug();
}
对象适配模式
Target与Adaptee类不做修改,只改Adapter类
// Adapter
public class ThreeToTwoAdapter implements TwoPlug {
private ThreePlug plug;
// 以参数传入
public ThreeToTwoAdapter(ThreePlug plug) {
this.plug = plug;
}
@Override
public int getTwoPlug() {
return changeToTwo();
}
private int changeToTwo() {
int originalPlug = plug.getThreePlug();
// 只接两根线,不使用接地线,对接!!
return 2;
}
}
ListView adapter
我们只需要实现下面4个方法,就可以做到自定义不同样式的item,而针对ListView来说都是一样的接口,非常方便
@Override
public int getCount() {
return 0;//返回总共多少个条目
}
@Override
public Object getItem(int position) {
return null;//返回每个条目的对象
}
@Override
public long getItemId(int position) {
return 0;//返回条目的id
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;//返回每个条目具体的View样式
}