适配器模式定义:
把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器的使用场景:
1、系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3、需要一个统一的输出接口,而输入端的类型不可预知。
总结:输入不可预知,但是输出是规定好的。
比如:
不管输入的是多少伏的电压,输出的必须是5V。
不管用户的item布局样式是什么,listview使用的item都是view类型。
代码示例:
系统只提供给我们苹果汁,而我们需要的是加了糖的苹果汁,所以无法直接使用系统的原料,这就是接口不兼容,此时我们就需要用适配器来做一个接口的转换。把苹果汁转换成加了糖的苹果汁。
1、类适配器模式(不够灵活,仅做介绍,不建议使用)
/**
* 系统提供给我们的苹果汁
*/
public class AppleJuice {
public String getAppleJuice() {
return "苹果汁";
}
public void doSomething() {
//系统制作苹果汁的其它神奇操作
}
}
/**
* 使用类适配器模式需要继承被适配对象
*/
public class JuiceAdapter extends AppleJuice {
@Override
public String getAppleJuice() {
//经过一系列复杂的惨无人道的工序
//我们给苹果汁加上了糖
return "加上了糖的" + super.getAppleJuice();
}
@Override
public void doSomething() {
super.doSomething();
}
}
我们用JuiceAdapter继承了AppleJuice,并返回了经过加工后符合输出要求的加了糖的苹果汁。
执行代码:
JuiceAdapter adapter = new JuiceAdapter();
String juice = adapter.getAppleJuice();
Log.i("LHD", "给我一杯" + juice);
输出结果:
是不是看起来很简单?是的,适配器模式的本质就是对接口的转换。
接下来我们看看对象适配器模式。
2、对象适配器模式
/**
* 苹果汁接口
*/
public interface FruitJuice {
String getFruitJuice();
}
/**
* 系统提供给我们的苹果汁
*/
public class AppleJuice {
public String getAppleJuice() {
return "苹果汁";
}
public void doSomething() {
//系统制作苹果汁的其它神奇操作
}
}
/**
* 对象适配器模式
*/
public class NewFruitJuiceAdapter implements FruitJuice {
AppleJuice appleJuice;
public NewFruitJuiceAdapter(AppleJuice appleJuice) {
this.appleJuice = appleJuice;
}
@Override
public String getFruitJuice() {
String juice = appleJuice.getAppleJuice();
//经过一系列逆天的操作
//得到一杯加了糖的苹果汁
return "加了糖的" + juice;
}
}
执行代码:
AppleJuice appleJuice = new AppleJuice();
NewFruitJuiceAdapter newFruitJuiceAdapter = new NewFruitJuiceAdapter(appleJuice);
String newJuice = newFruitJuiceAdapter.getFruitJuice();
Log.i("LHD", "给我一杯" + newJuice);
输出:
可以看到我们在适配器内部持有了一个系统提供的苹果汁对象的引用,然后实现了FruitJuice接口,并在getFruitJuice方法中返回了需要输出的苹果汁。
所以可以看到对象适配器模式就是在适配器内部持有输入接口的引用,经过一系列变化,把输入的接口转换成需要的目标接口。
这种实现方式需要将被是配的对象传入到adapter中,使用组合的方式实现接口的兼容,这种方式比类适配器更加灵活,它的另一个好处是被适配对象中的方法不会暴露出来,而类适配器由于继承了被适配的对象,因此,被适配对象类的函数在adaper中也含有,这就会让adapter类出现一些奇怪的接口,比如你可以直接调用doSomething方法,会更难维护,也会让用户的使用成本变高。
适配器模式的典型应用就是Listview,RecyclerView的Adapter啦,大家可自行阅读源码,此处不再赘述。
以上就是适配器模式的简单介绍啦! (#^ . ^#)