设计模式 - 适配器模式(Adapter_pattern)【摘自 wikipedia】

适配器设计模式描述了如何解决此类问题:

  • 定义一个单独的adapter类,将类 ( adaptee)的(不兼容)接口转换为target客户端需要的另一个接口 ( )。
  • 通过adapter处理(重用)没有所需接口的类。

这种模式的关键思想是通过一个单独的方法adapter来适应(已经存在的)类的接口而不改变它。

 

示例 

interface LightningPhone {
    void recharge();
    void useLightning();
}

interface MicroUsbPhone {
    void recharge();
    void useMicroUsb();
}

class Iphone implements LightningPhone {
    private boolean connector;

    @Override
    public void useLightning() {
        connector = true;
        System.out.println("Iphone Lightning connected");
    }

    @Override
    public void recharge() {
        if (connector) {
            System.out.println("Iphone Recharge started");
            System.out.println("Iphone Recharge finished");
        } else {
            System.out.println("Iphone Connect Lightning first");
        }
    }
}

class Android implements MicroUsbPhone {
    private boolean connector;

    @Override
    public void useMicroUsb() {
        connector = true;
        System.out.println("Android MicroUsb connected");
    }

    @Override
    public void recharge() {
        if (connector) {
            System.out.println("Android Recharge started");
            System.out.println("Android Recharge finished");
        } else {
            System.out.println("Android Connect MicroUsb first");
        }
    }
}
/* exposing the target interface while wrapping source object */
class LightningToMicroUsbAdapter implements MicroUsbPhone {
    private final LightningPhone lightningPhone;

    public LightningToMicroUsbAdapter(LightningPhone lightningPhone) {
        this.lightningPhone = lightningPhone;
    }

    @Override
    public void useMicroUsb() {
        System.out.println("LightningToMicroUsbAdapter MicroUsb connected");
        lightningPhone.useLightning();
    }

    @Override
    public void recharge() {
        lightningPhone.recharge();
    }
}

public class AdapterDemo {
    static void rechargeMicroUsbPhone(MicroUsbPhone phone) {
        phone.useMicroUsb();
        phone.recharge();
    }

    static void rechargeLightningPhone(LightningPhone phone) {
        phone.useLightning();
        phone.recharge();
    }

    public static void main(String[] args) {
        Android android = new Android();
        Iphone iPhone = new Iphone();

        System.out.println("-1- Recharging android with MicroUsb");
        android.useMicroUsb();
        android.recharge();
        System.out.println("");

        System.out.println("-2- Recharging iPhone with Lightning");
        iPhone.useLightning();
        iPhone.recharge();
        System.out.println("");
        System.out.println("-3- Recharging iPhone with MicroUsb");

        LightningToMicroUsbAdapter lightningToMicroUsbAdapter = new LightningToMicroUsbAdapter(iPhone);
        lightningToMicroUsbAdapter.useMicroUsb();
        lightningToMicroUsbAdapter.recharge();
    }
}

输出

-1- Recharging android with MicroUsb
Android MicroUsb connected
Android Recharge started
Android Recharge finished

-2- Recharging iPhone with Lightning
Iphone Lightning connected
Iphone Recharge started
Iphone Recharge finished

-3- Recharging iPhone with MicroUsb
LightningToMicroUsbAdapter MicroUsb connected
Iphone Lightning connected
Iphone Recharge started
Iphone Recharge finished

 

posted on 2021-11-19 13:56  Persevere0730  阅读(38)  评论(0)    收藏  举报