想象一个这样的场景:
有一个船长,他只会划皮艇。但有一天,他只有一艘渔船。这时候,他要如何才能驾驶这艘渔船航行呢?
将上面这个问题转化到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();}@Overridepublic void row() {boat.sail();}}
如上代码所示,适配器必须实现划艇接口,并且,在适配器中,需要有一个渔船类,然后实现划艇接口中row()方法,在其中,调用渔船的sail()方法。
public static void main(String[] args) {Captain captain = new Captain(new FishingBoatAdapter());captain.row();}
在Captain的构造器里,传入适配器对象,就可以实现使用Capitain对象调用FishingBoat里的方法了。
适配器模式比较简单,在实际编码中,有许多场景可以用到。
