有时候我们需要将一些不兼容的接口转换成可兼容的接口,这时候需要用到适配器模式。最简单的应用场景就是平时手机充电插头不兼容需要使用一个适配器来使得手机可以充电。
举个例子,手机在中国可以充电,在德国由于标准不一样则需要用适配器才能给手机充电,德国使用的是圆口插口供电,中国使用的是三项扁头插口供电。
所以,先写两个充电标准接口。并写出其实现类
DBSocketInterface.java:德标接口
package adapter;
/**
* 德标接口
*/
public interface DBSocketInterface {
/**
* 这个方法的名字叫做:使用两项圆头的插口供电
*/
void powerWithTwoRound();
}
DBSocket.java:实现充电功能
package adapter;
/**
* 德国插座
*/
public class DBSocket implements DBSocketInterface {
public void powerWithTwoRound() {
System.out.println("使用两项圆头的插孔供电");
}
}
GBSocketInterface.java:国标接口
package adapter;
/**
* 国标接口
*/
public interface GBSocketInterface {
/**
* 这个方法的名字叫做:使用三项扁头的插口供电
*/
void powerWithThreeFlat();
}
GBSocket 国标标准充电
package adapter;
public class GBSocket implements GBSocketInterface{
@Override
public void powerWithThreeFlat() {
System.out.println("使用三项扁头的插口供电");
}
}
在德国旅馆充电,写一个Hotel类
package adapter;
public class Hotel {
//旅馆的德国标准充电标准
private DBSocketInterface dbsocket;
public Hotel(){};
//构造函数初始化
public Hotel( DBSocketInterface dbsocket){
this.dbsocket=dbsocket;
}
//方法初始化
public void setSocket(DBSocketInterface dbsocket){
this.dbsocket=dbsocket;
}
//宾馆的充电插口
public void charge(){
dbsocket.powerWithTwoRound();
}
}
测试下该Hotel类是否可用,再新建一个测试类HotelTest
package adapter;
public class HotelTest {
public static void main(String[] args) {
DBSocketInterface dbsocket=new DBSocket();
Hotel hotel=new Hotel(dbsocket);
//Hotel hotel=new Hotel();
//hotel.setSocket(dbsocket);
hotel.charge();
}
}
测试结果:
使用两项圆头的插孔供电
如何使得国标标准的充电器可以使用德国标准的插口呢?这时候需要一个适配器。新建一个适配器类Adapter,适配器需要实现德国标准接口
package adapter;
public class Adapter implements DBSocketInterface{
private GBSocketInterface gbsocket;
//插入国标的充电器
public Adapter(GBSocketInterface gbsocket){
this.gbsocket=gbsocket;
}
//用适配器充电
@Override
public void powerWithTwoRound() {
gbsocket.powerWithThreeFlat();
}
}
测试下:
package adapter;
public class Test {
public static void main(String[] args) {
//带上国标充电器
GBSocketInterface socket=new GBSocket();
//去旅馆
Hotel hotel=new Hotel();
//拿一个适配器,并将国标充电器插入
Adapter adapter=new Adapter(socket);
//插入适配器
hotel.setSocket(adapter);
//充电
hotel.charge();
}
}
结果为:
使用三项扁头的插口供电
可以充电了。。。