设计模式第5篇:适配器模式

一.适配器模式要解决的问题

适配器模式属于结构设计模式,我们把将两个不相关的接口做一个适配以使二者进行交互的接口成为适配器。比如充电器就是一个适配器,正常电源是120V,手机电池输入电压是3V,电瓶车电池输入电压为20V,空调输入电压为120V,通过适配器适配,可以将120V电源转换为3V、20V、120V电源给各种用电设备充电,下面我们就以电源电压适配器为例说明适配器模式。

首先需要一个电压类来描述电压,如下:

class Volt {

    private int volts;
    
    public Volt(int v){
        this.volts=v;
    }

    public int getVolts() {
        return volts;
    }

    public void setVolts(int volts) {
        this.volts = volts;
    }
    
}

现在,我们有一个家庭电源,电压为120V,该电源描述如下:

class Socket {

    public Volt getVolt(){
        return new Volt(120);
    }
}

现在我们需要构建一个能够产生3种电压(3V、20V、120V)的电源适配器,下面先创建一个能产生这3种电压的适配器接口:

public interface SocketAdapter {

    public Volt get120Volt();
        
    public Volt get12Volt();
    
    public Volt get3Volt();
}

二.适配器模式的两种实现方式

     1.类适配器模式

     类适配器模式通过继承和扩展源接口来实现,在这里就是继承和扩展Socket类。    

class SocketClassAdapterImpl extends Socket implements SocketAdapter{
    @Override
    public Volt get120Volt() {
        return getVolt();
    }

    @Override
    public Volt get20Volt() {
        return changeVolt(getVolt(),6);
    }

    @Override
    public Volt get3Volt() {
        return changeVolt(getVolt(),40);
    }
    public Volt changeVolt(Volt volt,int i){
        int volts=volt.getVolts();
        return new Volt(volts/i);
    }
}

        2.对象适配器模式

    对象适配器模式通过组合,将源类引入适配器类中。

class SocketObjectAdapterImpl implements SocketAdapter{
   //源类socket被引入进来
Socket socket
=new Socket(); @Override public Volt get120Volt() { return socket.getVolt(); } @Override public Volt get20Volt() { return changeVolt(socket.getVolt(),6); } @Override public Volt get3Volt() { return changeVolt(socket.getVolt(),40); } public Volt changeVolt(Volt volt,int i){ int volts=volt.getVolts(); return new Volt(volts/i); } }

两个适配器类的测试如下:

public class AdapterTest{
    public static void main(String[] args) {
        socketClassAdapterTest();
        socketObjectAdapterTest();
    }
    private static void socketClassAdapterTest(){
        SocketAdapter classAdapter = new SocketClassAdapterImpl();
        Volt volt3=getAdapterVolt(classAdapter,3);
        Volt volt20=getAdapterVolt(classAdapter,20);
        Volt volt120=getAdapterVolt(classAdapter,120);
        System.out.println("3V:"+volt3.getVolts());
        System.out.println("20V:"+volt20.getVolts());
        System.out.println("120V:"+volt120.getVolts());
    }
    private static void socketObjectAdapterTest(){
        SocketAdapter objectAdapter = new SocketObjectAdapterImpl();
        Volt volt3=getAdapterVolt(objectAdapter,3);
        Volt volt20=getAdapterVolt(objectAdapter,20);
        Volt volt120=getAdapterVolt(objectAdapter,120);
        System.out.println("3V:"+volt3.getVolts());
        System.out.println("20V:"+volt20.getVolts());
        System.out.println("120V:"+volt120.getVolts());
    }
    private static Volt getAdapterVolt(SocketAdapter adapter,int volts){
        switch (volts){
            case 120:return adapter.get120Volt();
            case 20:return adapter.get20Volt();
            case 3:return adapter.get3Volt();
            default:return adapter.get120Volt();
        }
    }
}
原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10222163.html