适配器模式在JDK中的使用,大概有这些
java.util.Arrays #asList()
javax.swing.JTable (TableModel)
java.io.InputStreamReader (InputStream)
java.io.OutputStreamWriter (OutputStream)
javax.xml.bind.annotation.adapters.XmlAdapter #marshal()
javax.xml.bind.annotation.adapters.XmlAdapter #unmarshal()
一开始,我认为(潜意识)适配器模式就是继承接口,在不同的子类中有不同的实现。
但是,我看到的是,
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
接着看下ArrayList在哪,按住ctrl+左击,
额,怎么看都和我想象的适配器模式不同哎。
一不小心翻到《Java与模式》 第22章 适配器\(Adapter\)模式 ,
原来,适配器模式有两种,分别为:类适配器和对象适配器。如下图,(左为类适配器,右为对象适配器)
那么,
看到我画的红圈圈吗,知道它们之间的区别是什么吗?
答案:空心三角,其实是用例与用例之间的关系;而箭头则是角色与用例的关系;
那么这里应该是类适配器。至于为什么,你先看,
这个是对象适配器的,别搞混了。。。
不知道你对适配器模式清晰没。。。这本书超好的。。。
额外的知识点:
- java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用。
- Arrays.asList() 方法使用场景
Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List 。但是,生成的List的长度是固定的;能够进行修改操作(比如,修改某个位置的元素);不能执行影响长度的操作(如add、remove等操作),否则会抛出UnsupportedOperationException异常。
所以 Arrays.asList 比较适合那些已经有数组数据或者一些元素,而需要快速构建一个List,只用于读取操作,而不进行添加或删除操作的场景。
如果你还不了解的话,可以接着看下篇。
参考资料:
JDK1.8源码(四)——java.util.Arrays 类
Java与模式