说起适配器其实在我们的生活中是非常常见的,比如:学校的宿舍的电压都比较低,而有的学生想使用大功率电器,宿舍的就会跳闸,然而如果你使用一个适配器(变压器)就可以使用了(温馨提示宿舍使用大功率电器不太安全,容易引起火灾,希望大家谨慎使用)。
又比如说,有的插座都是三孔的,而我们用的大部分电器是两孔的,这时我们可以使用一个适配器,适配器本身是三孔的,它可以直接插到三孔的插头上,适配器本身可以提供一个两孔的插座,然后我们就可以插到适配器上了,这样我们原本只能插到两孔上的插头就能用三孔的插座了。
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
适配器模式里面总共拥有三个角色,它们分别是:
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
类适配器的原理就是通过继承来实现适配器功能。
让Adapter实现Target接口,并且继承Adaptee,这样Adapter就具备Target和Adaptee的特性,就可以将两者进行转化。
举例:以不同设备使用不同交流电为例,通过电源适配器进行转换说明。
public interface Target {
int out();
}
public class Adaptee{
public int input() {
System.out.println("输入交流电: 220V");
return 220;
}
}
public class Adapter extends Adaptee implements Target {
@Override
public int out() {
int input220V = super.input();
int output = input220V / 2;
System.out.println("输出交流电: " + output + "V");
return output;
}
}
public static void main(String[] args) {
Target adapter = new Adapter();
int result = adapter.out();
System.out.println(result);
}
输入交流电: 220V
输出交流电: 110V
110
对象适配器的原理就是通过组合来实现适配器功能。
让Adapter实现Target接口,然后内部持有Adaptee实例,然后再Target接口规定的方法内转换Adaptee。
public interface Target {
int out();
}
public class Adaptee{
public int input() {
System.out.println("输入交流电: 220V");
return 220;
}
}
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public int out() {
int output = adaptee.input() / 2;
System.out.println("输出交流电: " + output + "V");
return output;
}
}
public static void main(String[] args) {
Target adapter = new Adapter(new Adaptee());
int result = adapter.out();
System.out.println(result);
}
输入交流电: 220V
输出交流电: 110V
110
接口适配器的使用场景是解决接口方法过多,如果直接实现接口,那么类会多出许多空实现的方法,类显得很臃肿。此时,使用接口适配器就能让我们只实现我们需要的接口方法,目标更清晰。
接口适配器的主要原理就是原理利用抽象类实现接口,并且空实现接口众多方法。
public interface Target {
int out1();
int out2();
int out3();
int out4();
}
public class Adaptee{
public int input() {
System.out.println("输入交流电: 220V");
return 220;
}
}
public class Adapter implements Target {
protected Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public int out1() {
int input220V = adaptee.input();
int output = input220V / 1;
System.out.println("输出交流电: " + output + "V");
return output;
}
@Override
public int out2() {
int input220V = adaptee.input();
int output = input220V / 2;
System.out.println("输出交流电: " + output + "V");
return output;
}
@Override
public int out3() {
return 0;
}
@Override
public int out4() {
return 0;
}
}
public static void main(String[] args) {
Target adapter = new Adapter(new Adaptee());
adapter.out1();
System.out.println("---------------------");
adapter.out2();
System.out.println("---------------------");
Target adapter2 = new Adapter(new Adaptee()) {
@Override
public int out3() {
int input220V = adaptee.input();
int output = input220V / 3;
System.out.println("输出交流电: " + output + "V");
return output;
}
};
adapter2.out3();
System.out.println("---------------------");
Target adapter3 = new Adapter(new Adaptee()) {
@Override
public int out4() {
int input220V = adaptee.input();
int output = input220V / 4;
System.out.println("输出交流电: " + output + "V");
return output;
}
};
adapter3.out4();
}
输入交流电: 220V
输出交流电: 220V
---------------------
输入交流电: 220V
输出交流电: 110V
---------------------
输入交流电: 220V
输出交流电: 73V
---------------------
输入交流电: 220V
输出交流电: 55V
适配器模式优点:
适配器模式缺点:
缺点: