JAVA设计模式 - 适配器(Adapter)

适配器(Adapter)

我们学习一个模式,首先从名字理解。生活中常见的适配器就是电源适配器。作用是将电压,电流转换成电器需要的电压电流。

我们只需要记住一句话,适配器就是把类接口转换成另一个用户需要的接口(转换接口)。

在iphone11,iphone12拥有不同的通信技术。现在想让11调用5G信号接口,就给它加上一个适配器。

public interface Iphone12 {
    
    
    void communicateBy5G();
}
public interface Iphone11 {
    
    
    void communicateBy4G();
}
public class Iphone11Impl implements Iphone11 {
    
    
    @Override
    public void communicateBy4G() {
    
    
        System.out.println("communicate by 4G!");
    }
}
public class Iphone11Adapter implements Iphone12 {
    
    
    Iphone11 iphone11;

    public Iphone11Adapter(Iphone11 iphone11) {
    
    
        this.iphone11 = iphone11;
    }

    @Override
    public void communicateBy5G() {
    
    
        iphone11.communicateBy4G();
    }
}
/**
** 可以看出虽然创建的对象是iphone12,但实际上使用的是4G通信。
**/
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Iphone11 iphone11 = new Iphone11Impl();
        Iphone12 iphone12 = new Iphone11Adapter(iphone11);
        iphone12.communicateBy5G();
    }
}
//communicate by 4G!

Example

可以看出实际上使用的还是4G,适配器的作用是给用的人看起来像是在使用别的类,实际上操作的还是原本对象。

以下是Arrays.asList()在适配器模式下的使用,我相信看完你对适配器的理解会更进一步。

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    
    
    return new ArrayList<>(a);
}

再看

ArrayList(E[] array) {
    
    
    a = Objects.requireNonNull(array);
}
  • 可以看到Arrays.asList(T… a)方法知识按断了一下是否为空,就把地址赋值给了a。
  • 所以说,改变list列表的值,原数组的值也会跟着改变。反之也同理。

从中可以看出,调用asList()返回List,但实际上存储结构还是数组。这里将操作数组的操作隐藏起来,让用的人认为是在操作List(转换接口)就是适配器的核心思想。

猜你喜欢

转载自blog.csdn.net/weixin_43957211/article/details/111186037