前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >适配器模式

适配器模式

作者头像
海纳
发布2018-03-02 14:50:18
6930
发布2018-03-02 14:50:18
举报
文章被收录于专栏:海纳周报

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

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

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

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

代码语言:javascript
复制
    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就掌握了大部分了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HinusWeekly 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档