【设计模式-适配器模式】

2020-09-01 16:23:46 浏览数 (3)

【导读】如果多样东西需要使用同一件物品,则需要进行适配,比如只有一个电源插口,但有多个需要用电的(有三相插头,有二相插头),此时就需要一个排查器进行适配,使三相和二相插头都能连接电源。再比如,变压器也是一个适配器,电厂来的是几十万伏的电,但家用电是220V,所以需要将几十万伏的电转成220V的电才能进行使用。

一、定义

将一个类的接口转换成期望的接口,使得原本接口不兼容而不能一起工作的类能一起工作。

但是接口之间是没有层次关系的(也就是继承或实现)。

二、实例

比如电源适配的,一般家用电都是220V,但是手机充电只需要5V,此时手机充电器就相当于是一个适配器,将220V转成手机充电需要的5V。

220V电源:

代码语言:javascript复制
public class AC220V {
    public int output(){
        int output = 220;
        System.out.println("输出" output "v");
        return output;
    }
}

需要的5V电源:

代码语言:javascript复制
public interface DC5V {
    int output();
}

变压器(也就是充电器):

代码语言:javascript复制
public class Transformer implements DC5V{
    1、包含了220V的属性
    private AC220V ac220V ;
    public Transformer(AC220V ac220V) {
        this.ac220V = ac220V;
    }

    @Override
    public int output() {
        int input = ac220V.output();
        2、经过相应的逻辑转换成需要的5V
        int output = input / 44;
        System.out.println("输入" input "v,输出" output "v");
        return output;
    }
}

测试类:

代码语言:javascript复制
DC5V dc5V = new Transformer(new AC220V());
dc5V.output();

运行结果:

接下来看一下类图:

注意看,原有接口AC220V与需要适配的接口DC5V是没有层次关系的,通过适配者类去进行适配。

三、源码实例

Java的IO使用了适配器模式,Reader和InputStream是没有层次关系的。想要将InputStream转成Reader,就需要用到InputStreamReader这个转换接口。

代码语言:javascript复制
Reader reader =  new InputStreamReader(new FileInputStream("test"));

它们之间的类结构如下:

0 人点赞