**
**
为解决两个对象或者接口之间的不兼容而需要引入第三方进行适配
简单来说就是代码中的转换器
当需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时就使用适配器模式。
我们用的是220V的交流电,为了满足不同电器的使用,我们于是有了一个转换电源电压的装置,来保护电器,这是最明显的适配器
1.现在用电脑的朋友,看下后面那一坨充电器就明白了吧!!
2.同理手机也是这样
目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。我的电子产品
适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。 充电器,转换器
适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。 220V交流电
现在一般有三种适配器类型模式选择
a.类适配器
b.对象适配器
c.抽象适配器
1.类适配器模式
现在抽象一个场景:我们来给我的洋气手机充电,手机和电源我们已经找好了,现在就差一个适配器了
插座
//220V的交流插座
public class Adaptee {
public int output220V() {
int output = 220;
return output;
}
}
适配器接口
//适配器接口
public interface Target {
int output5V();
}
具体适配器
//具体的将220V转换
public class ClassAdapter extends Adaptee implements Target {
@Override
public int output5V() {
int output = output220V();
return (output/44);
}
}
客户端测试
public class ClassAdapterTest {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
System.out.println("电源的电压是"+adaptee.output220V()+"V");
Target out5v=new ClassAdapter();
System.out.println("转换后的电压"+out5v.output5V()+"V");
}
}
2.对象适配器模式
插座
//220V的交流插座
public class Adaptee {
public int output220V() {
int output = 220;
return output;
}
}
适配器接口
//适配器接口
public interface Target {
int output5V();
}
具体适配器 区别
//具体的将220V转换
public class ObjAdapter implements Target {
private Adaptee adaptee;
//利用构造函数
public ObjAdapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
@Override
public int output5V() {
Adaptee adaptee=new Adaptee();
System.out.println("电源的电压是"+adaptee.output220V()+"V");
int output = adaptee.output220V();
return (output/44);
}
}
测试
public class ObjAdapterTest {
public static void main(String[] args) {
ObjAdapter adaptee=new ObjAdapter(new Adaptee());
System.out.println("转换后的电压"+adaptee.output5V()+"V");
}
}
区别
a.类适配器可以重定义实现行为,而对象适配器重定义适配的行为比较困难,但是添加行为较方便。
b.对象适配器通过委派与adaptee衔接,即持有adaptee对象,是动态的方式;类适配器通过集成与adaptee衔接,也就是说类适配器继承adaptee,并且实现target方法,是静态的方式。
c.由于对象适配器采用动态的方式与adaptee衔接,使得它可以对不同的适配源及其子类进行适配.
尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。
3.现在我想一个充电器头可以输出不同的电流,实现快充和慢充 1A 2A 3A的接口,将接口再次抽象一下
插座
//220V的交流插座
public class Adaptee {
public int output220V() {
int output = 220;
return output;
}
}
适配器接口
/*对于接口适配器模式,我们的接口可以有更多的抽象方法,但我们只需要关心我们需要的回调方法
(详见AnimatorListenerAdapter类),我们把接口比作万能适配器:*/
public interface Target {
int output1A();
int output2A();
int output3A();
}
中间适配器
/*我们必须存在一个中间适配器,用于实现默认的接口方法,以至于减少我们适配器的代码量,让代码更加清晰*/
public abstract class PowerAdapter implements Target {
//I=U/R
public int R1=220;
public int R2=110;
public int R3=70;
@Override
public int output1A() {
return 220/R1;
}
@Override
public int output2A() {
return 220/R1;
}
@Override
public int output3A() {
return 220/R1;
}
}
单独电流接口
public class Adapter1A extends PowerAdapter{
@Override
public int output1A() {
int output = super.output1A();
return output;
}
}
2A,3A…
测试
public class Test {
public static void main(String[] args) {
PowerAdapter powerAdapter=new Adapter1A();
powerAdapter.output1A();
System.out.println("这是一个"+ powerAdapter.output1A()+"A的适配器");
}
}