适配器模式

时间:2022-05-02
本文章向大家介绍适配器模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在面向对象的程序设计中,我们经常会反复地遇到相同的问题,于是有人就做了抽象,把这些可能反复出现的场景提取出来,用一种通用的方法去解决它。我们把这种通用的方法叫做设计模式。

例如,我们第一篇文章里的问题。需求是直接处理字符,但是,输入进来的却是编码的字节。我们希望有这么一个类,能自动解码并向我们提供字符读写的接口。这个类打通了字节处理与字符处理之间的堑沟。这个类就叫做适配器类。下面是它的类图

通过这个图,可以看到,我们期望的接口是Target类型的,这个类型定义了request这个方法。但是我们只有一个Adaptee的对象,它只能提供specificRequest,所以我们就自己做了一个适配器类Adaptor,这个类中有一个成员变量是Adaptee类型的。使用Adaptee提供的方法实现Target接口,这就是适配器做的事情。

回到我们的具体问题,现在已经有了字节码处理的 InputStream,我们的目标接口是可以处理字符的Reader,所以我们就需要一个可以把字节码转成字符的 InputStreamReader。这就是适配器的能力啊。

    public static void main(String args[]) {
        char[] cbuf = new char[256];
        System.out.println("hey, may I have your name, please? ");
        int n = 0;
            Reader r = new InputStreamReader(System.in);
        try {
            n = r.read(cbuf);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("hello, Mr. " + cbuf[0]);
    }

可以看到,我们终于可以通过 char 类型的数组直接拿到解码好的汉字了。这个程序里,字节InputStream 到字符 Reader 的适配器类 InputStreamReader 居功至伟。

我们把适配器类的分析拿过来,分析一下 java io 这个 package 里的类都是些什么。

已经有了操作文件的 File,我们的目标接口是可以处理字节的 InputStream,所以我们就需要一个可以把文件操作变成流操作的 FileInputStream。

已经有了操作网络接口的 Socket,我们的目标接口是可以处理字节的 InputStream,所以我们就需要一个可以把网络操作变成流操作的 SocketInputStream。

已经有了操作字符串的String,我们的目标接口是可以处理字符的 Reader,所以我们就需要一个可以把字符串操作变成字符操作的 StringReader。

…………

这个可以写很长。如果有读者曾经读过的我一个关于如何学习Java的文章,应该还记得,我曾经说过,IO的类是不用去死记硬背的,学完了几个常见的设计模式,有些类名,自己猜都能猜出来。呐,这就是我的课程里介绍的第一个设计模式:适配器模式。是不是感觉到 java.io http:/ja这个package瞬间就毫无秘密可言了呢?

记住 InputStreamReader / OutputStreamWriter 是连通字节与字符的桥梁。XxxReader(InputStream / OutputStream / Writer) 则是连通某一类操作与输入输出流的桥梁。那么 java.io http://java就掌握了大部分了。