想象一个这样的场景:
有一个船长,他只会划皮艇。但有一天,他只有一艘渔船。这时候,他要如何才能驾驶这艘渔船航行呢?
将上面这个问题转化到Java中:
给定一个类:
public interface RowingBoat {
void row();
}
上面是一个划艇接口,只有一个方法row().
然后有一个船长:
public class Captain {
private RowingBoat rowingBoat;
public Captain() {}
public Captain(RowingBoat rowingBoat) {
this.rowingBoat = rowingBoat;
}
public void setRowingBoat(RowingBoat rowingBoat) {
this.rowingBoat = rowingBoat;
}
public void row() {
rowingBoat.row();
}
}
船长拥有一个成员变量,类型是划艇,有一个方法为row(),其中调用了划艇的row()方法,可见该船长只会划皮艇。
这时候,湖面上只有一艘渔船,而没有划艇:
public class FishingBoat {
private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoat.class);
public void sail() {
LOGGER.info("The fishing boat is sailing");
}
}
且这个渔船只有sail()方法。
适配器模式要解决的问题,就是如何让船长调用row()方法时,调用到渔船的sail()方法呢?
此时只需要添加一个适配器,将船长和渔船适配起来:
public class FishingBoatAdapter implements RowingBoat {
private FishingBoat boat;
public FishingBoatAdapter() {
boat = new FishingBoat();
}
@Override
public void row() {
boat.sail();
}
}
如上代码所示,适配器必须实现划艇接口,并且,在适配器中,需要有一个渔船类,然后实现划艇接口中row()方法,在其中,调用渔船的sail()方法。
public static void main(String[] args) {
Captain captain = new Captain(new FishingBoatAdapter());
captain.row();
}
在Captain的构造器里,传入适配器对象,就可以实现使用Capitain对象调用FishingBoat里的方法了。
适配器模式比较简单,在实际编码中,有许多场景可以用到。