首先我们想象一下我们的生活,我们在充电的时候常常会用到适配器,如果我的手机充电线是usb接口的,但是插座是2相或者3相的插座,肯定不能直接将USB插到插座里,就需要一个适配器将2或3相的转换成我们需要的接口(USB)进行运用,我们再将线插入适配器里充电。还有很多类似的例子。
适配器分3种 类的适配器 对象适配器 接口适配器
只有一个总的目的:我们把我们的手机看做是客户端,它的目的就是将某个类的接口,转换成客户端期望的一个接口,消除类的不匹配所造成的兼容性问题。
1类的适配器:
需求 手机充电
待适配的插座:PowerSource
客户端期望的接口(适配器上的USB接口):PowerTagtable
适配器:Adapter
测试类客户端:iphoneAdapterTest
类图:
代码:
package leiadapter;
public class PowerSource {
public void method1(){
System.out.println("sourcemethod1 插座充电中");
}
}
package leiadapter;
public interface PowerTagtable {
public void method2();
//接口保留原来的方法
public void method1();
}
package leiadapter;
public class Adapter extends PowerSource implements PowerTagtable {
//调用新的方法
@Override
public void method2(){
System.out.println("USB 充电中");
}
//调用父类原来的方法
@Override
public void method1() {
// TODO Auto-generated method stub
super.method1();
}
}
package leiadapter;
public class IphoneAdapterTest {
public static void main(String[] args) {
PowerTagtable powerTagtable = new Adapter();
//调用新的method2
powerTagtable.method2();
}
}
2对象适配器
和类的适配器极为相似,不同在于Adapter持有 PowerSource的对象:
类图:
代码:
package leiadapter;
public class PowerSource {
public void method1(){
System.out.println("sourcemethod1 插座充电中");
}
}
package leiadapter;
public interface PowerTagtable {
public void method2();
//接口保留原来的方法
public void method1();
}
package duixiangadapter;
/*
* 不再继承源了
*/
public class Adapter implements PowerTagtable {
private PowerSource powerSource;
public Adapter(PowerSource source) {
this.powerSource = source;
}
//调用新的方法
@Override
public void method2(){
System.out.println("USB 充电中");
}
//调用父类原来的方法
@Override
public void method1() {
powerSource.method1();
}
}
package duixiangadapter;
public class IphoneAdapterTest {
public static void main(String[] args) {
PowerSource powerSource = new PowerSource();
PowerTagtable powerTagtable = new Adapter(powerSource);
//调用新的method2
powerTagtable.method2();
}
}
3接口适配器设计模式 也叫缺省适配器设计模式
图 懒得画了
我们实现接口的时候,如果有时候不想全部实现所有方法,就可以用抽象类,用抽象类实现所有方法,然后用适配器类去继承想要实现的方法
package jiekouadapter;
public interface SourceInterface {
public void method1();
public void method2();
public void method3();
public void method4();
public void method5();
}
package jiekouadapter;
public abstract class AdapterAbstract implements SourceInterface {
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
@Override
public void method4() {
// TODO Auto-generated method stub
}
@Override
public void method5() {
// TODO Auto-generated method stub
}
}
package jiekouadapter;
public class Adapter1 extends AdapterAbstract {
@Override
public void method1() {
System.out.println("m1");
}
@Override
public void method3() {
System.out.println("m3");
}
}
package jiekouadapter;
public class Adapter2 extends AdapterAbstract {
@Override
public void method2() {
System.out.println("m2");
}
@Override
public void method5() {
System.out.println("m5");
}
}