适配器模式,顾明思议就是适配。就像我们的手机充电接口不合适的时候,在前面搞个转接口,转接口再插到电源上就可以充电了。又比如我们的内存卡,电脑是没办法直接读取的,这个时候我们需要用到一个读卡器的东西,那么把内存卡插到读卡器上,读卡器插到电脑上就可以了。这个转接头,读卡器就是我们说的适配。
在程序里面适配呢主要是分为3种适配,类适配,对象适配,接口适配
类适配
假如我们这里要通过target的接口调用source的方法,那么直接利用target实现类是不行的,除非在实现类维护source的对象。那么这种情况下,最好就是用适配器来做。
/**
* 目标接口
*/
public interface Target {
public void outputTarget();
}
/**
*目标实现类
*/
public class TargetImpl implements Target {
@Override
public void outputTarget() {
System.out.println("输出target");
}
}
public class Source {
public void outputSource(){
System.out.println("我输出的是source");
}
}
在适配器里面,通过继承Source类,实现Target接口,这个时候在通过target调用source方法,从而达到目的。
public class PowerAdapter extends Source implements Target {
@Override
public void outputTarget() {
super.outputSource();
}
}
测试一下,结果为调用到source方法。
public class MainTest {
public static void main(String[] args) {
PowerAdapter powerAdapter = new PowerAdapter();
powerAdapter.outputTarget();
}
}
我输出的是source
对象适配
正如类适配里面提到的,如果不采用继承的方式,那么就必须在维护一个对象。将上面的代码改造一下。
public class PowerAdapter implements Target {
private Source source;
public PowerAdapter(Source source){
this.source=source;
}
@Override
public void outputTarget() {
source.outputSource();
}
}
测试
public class MainTest {
public static void main(String[] args) {
Source source=new Source();
PowerAdapter powerAdapter = new PowerAdapter(source);
powerAdapter.outputTarget();
}
}
我输出的是source
对象适配这里实际上,我们还可以把Source定义为接口,这样我们采用多态的形式就会更加的灵活。根据传递的对象,调用其具体的方法
接口适配
接口适配比较简单,假如我有一个接口,里面有10个方法,那么有一个业务类要实现这个接口,但是我只需要里面的一个方法的功能。根据接口规则,必须把10个方法都实现一遍。这样就非常的不友好。那么我们一般在中间加一个抽象类,先去实现这个接口,然后再用业务类继承抽象类,覆写里面的某一个方法即可。
接口
public interface Target {
public void menthod1();
public void menthod2();
public void menthod3();
}
抽象类
public abstract class AbstractAdapter implements Target{
@Override
public void menthod1() {
}
@Override
public void menthod2() {
}
@Override
public void menthod3() {
}
}
目标类
public class Source extends AbstractAdapter {
@Override
public void menthod1() {
super.menthod1();
}
}