适配器模式

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

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

通过这个图,可以看到,我们期望的接口是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就掌握了大部分了。

本文分享自微信公众号 - HinusWeekly(gh_4b8b4eda4e40),作者:海纳

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java线程模型

    大家新年好。2018年的第一期来得晚了一些。因为年底有很多工作要做,加班多了一些,公众号停更了两周。 今天借着知乎上一个关于线程模型的问题,我正好可以讲一下Ja...

    海纳
  • 如何学习Java

    不要被什么科班出身之类的说法吓坏了。虽然我是科班出身,但我始终觉得,只要你肯努力,这里面并没有什么无法逾越的鸿沟,最重要的是不要好高骛远,也不要急于求成。学习和...

    海纳
  • Java的字符串常量相关的一个问题

    大家过年好!春节假期休了一个长假,今天刚回来。在知乎上遇到了一个很好的问题,忍不住回答了一下。原文转载过来了。 以下代码的运行结果,如何解释? String h...

    海纳
  • LeetCode3. Longest Substring Without Repeating Characters

    用户1665735
  • Mysql从入门到放弃(三)

    insert into 表名(字段1,字段2...) values(值1,值2...)

    会呼吸的Coder
  • Mysql字段类型设计相关问题!

    Mysql是以文件存储在我们的系统的硬盘上面,那么

    思梦php
  • Python柯里化Currying

    py3study
  • Mysql字段类型设计相关问题!

    Mysql是以文件存储在我们的系统的硬盘上面,那么

    思梦php
  • 【框架】119:mybatis框架最后一天

    用association标签说明Order实体类中的user属性是和User实体类对应的。

    刘小爱
  • Collection接口-常用方法

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite...

    mcxfate

扫码关注云+社区

领取腾讯云代金券