想象一个这样的场景:

    有一个船长,他只会划皮艇。但有一天,他只有一艘渔船。这时候,他要如何才能驾驶这艘渔船航行呢?

    将上面这个问题转化到Java中:
    给定一个类:

    1. public interface RowingBoat {
    2. void row();
    3. }

    上面是一个划艇接口,只有一个方法row().
    然后有一个船长:

    1. public class Captain {
    2. private RowingBoat rowingBoat;
    3. public Captain() {}
    4. public Captain(RowingBoat rowingBoat) {
    5. this.rowingBoat = rowingBoat;
    6. }
    7. public void setRowingBoat(RowingBoat rowingBoat) {
    8. this.rowingBoat = rowingBoat;
    9. }
    10. public void row() {
    11. rowingBoat.row();
    12. }
    13. }

    船长拥有一个成员变量,类型是划艇,有一个方法为row(),其中调用了划艇的row()方法,可见该船长只会划皮艇。
    这时候,湖面上只有一艘渔船,而没有划艇:

    1. public class FishingBoat {
    2. private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoat.class);
    3. public void sail() {
    4. LOGGER.info("The fishing boat is sailing");
    5. }
    6. }

    且这个渔船只有sail()方法。
    适配器模式要解决的问题,就是如何让船长调用row()方法时,调用到渔船的sail()方法呢?
    此时只需要添加一个适配器,将船长和渔船适配起来:

    1. public class FishingBoatAdapter implements RowingBoat {
    2. private FishingBoat boat;
    3. public FishingBoatAdapter() {
    4. boat = new FishingBoat();
    5. }
    6. @Override
    7. public void row() {
    8. boat.sail();
    9. }
    10. }

    如上代码所示,适配器必须实现划艇接口,并且,在适配器中,需要有一个渔船类,然后实现划艇接口中row()方法,在其中,调用渔船的sail()方法。

    1. public static void main(String[] args) {
    2. Captain captain = new Captain(new FishingBoatAdapter());
    3. captain.row();
    4. }

    在Captain的构造器里,传入适配器对象,就可以实现使用Capitain对象调用FishingBoat里的方法了。

    适配器模式比较简单,在实际编码中,有许多场景可以用到。