适配器模式

Java设计模式之——适配器模式
适配器模式是结构化设计模式的一种。
它可以让两个没有联系的接口一起使用。将这些没有联系的接口结合起来的对象就是适配器。
现实生活的例子,我们可以把手机充电器作为一个适配器,因为手机电池需要3伏特充电,但正常的插座产生120V(美国) 或240V(印度)。因此手机充电器可以作为移动充电插座和电源插座之间的适配器。

本文将通过适配器模式实现多适配器。
首先,创建两个类 -Volt(测量伏特)和Socket(生产120V恒定电压)

Volt.java
public class Volt{
    private int volts;
    public Volt(int volts){
        this.volts = volts;
    }
    public int getVolts(){
        return this.volts;
    }

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


Socket.java
public class Socket{
    public Volt getVolts(){
        return new Volt(120);
    }
} 

现在我们想创建一个可以生产3V,12V和默认120V的适配器,首先我们创建一个带有这些方法的接口。

两种方式的适配器模式:
当实现适配器模式的时候,有两种方法:

  • 类适配器,这种形式使用Java继承和扩展了源接口,如Socket类
  • 对象适配器,这种形式使用Java组成的适配器包含源对象

    类适配器的实现:

public class SocketClassAdapterImpl extends Socket implements SocketAdapter{
    @Override
    public Volt get30Volt(){
        Volt v = getVolts();
        return this.convertor(v, 4);
    }

    @Override
    public Volt get120Volt(){
        return getVolts();
    }

    @Override
    public Volt get3Volt(){
        Volt v = getVolts();
        return convertor(v, 40);
    }

    private Volt convertor(Volt v, int i){
        return new Volt(v.getVolts()/i);
    }
}

对象适配器的实现

public class SocketObjectAdapterImpl implements SocketAdapter{
    private Socket sock = new Socket();

    @Override
    public Volt get30Volt(){
        Volt v = sock.getVolts();
        return convertor(v, 4);
    }

    @Override
    public Volt get3Volt(){
        Volt v = sock.getVolts();
        return convertor(v, 40);
    }

    private Volt convertor(Volt v, int i){
        return new Volt(v.getVolts()/i);
    }

}

测试代码:

// AdapterPatternTest.java
public class AdapterPatternTest{
    public static void main(String[] args){
        testClassAdapter();
        testObjectAdapter();
    }

    public static void testClassAdapter(){
        SocketAdapter socketAdapter = new SocketClassAdapterImpl();
        System.out.println("class adapter is get3Volt:" + socketAdapter.get3Volt().getvolts());
        System.out.println("class adapter is get30Volt:" + socketAdapter.get30Volt().getvolts());
        System.out.println("class adapter is get120Volt:" + socketAdapter.get120Volt().getvolts());
    }

    public static void testObjectAdapter(){
        SocketAdapter socketAdapter = new SocketObjecterImpl();
        System.out.println("object adapter is get3Vot:"+socketAdapter.get3Volt().getVolts());
        System.out.println("object adapter is get30Vot:"+socketAdapter.get30Volt().getVolts());
        System.out.println("object adapter is get120Vot:"+socketAdapter.get120Volt().getVolts());
    }
}

在JDK中适配器模式示例:

java.util.Arrays # asList()
java.io.InputStreamReader(InputStream)  (return a Reader)
java.io.OutputStreamWriter(OutputStream) (return a Writer)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值