Java技术常用设计模式(八)--- 适配器模式

1 适配器模式概述

适配器模式

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

什么时候用到?

系统开发中因不同的开发人员、不同的产品、不同的厂家的开发造成功能类似而接口不同的情况,需要用适配器模式适配。即当我们需要使用一个类,但是这个类可能不符合我们的需求时就需要使用适配器模式。

好处

1) 将目标类和适配者类解耦,通过使用适配器让不兼容的接口变成了兼容,让客户从实现的接口解耦。
2)增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
3)灵活性和扩展性都非常好在不修改原有代码的基础上增加新的适配器类,符合“开闭原则”。

2 适配器模式结构图

Alt text

组成:
Target类:目标接口,客户所期待的接口。
Adaptee类:需要适配的类或适配者类。
Adapter类:通过在内部包装一个Adaptee对象,把源接口转换成目标接口。

3 适配器模式的Java代码实现

模拟将一个写接口适配成读接口。
Java代码如下:

/**
 * Target:客户所期待的接口
 * @author GenshenWang.nomico
 */
public interface ReadTarget {
    public void read();
}

/**
 * Adaptee:需要被适配的类,即需要被转化的类
 * @author GenshenWang.nomico
 */
public class FileWriteOperation{

    public void write() {
        System.out.println("写一行数据。。。");
    }
}

/**
 * Adapter:适配器:把源接口写 》》》 目标接口读
 * @author GenshenWang.nomico
 */
public class Adapter implements ReadTarget {

    //写》读
    FileWriteOperation writeOpe = new FileWriteOperation();

    public Adapter(FileWriteOperation writeOpe){
        this.writeOpe = writeOpe;
    }
    @Override
    public void read() {
        writeOpe.write();
    }
}


//写》读
    public static void main(String[] args) {
        FileWriteOperation writeOpe = new FileWriteOperation();
        writeOpe.write();

        ReadTarget read = new Adapter(writeOpe);
        read.read();
    }

输出:
写一行数据。。。

4 Java I/O中适配器模式的实现

JDK中有多处使用到了适配器模式:

java.util.Arrays.#asList();
java.util.Collections#synchronizedCollection();
java.io.InputStreamReader(InputStream) {returns a Reader};
java.io.OutputStreamWriter(OutputStream) {returns a Writer};

本文介绍下InputStreamReader是如何应用的适配器模式。
我们知道InputStream/OutputStream是用来处理字节流的;Reader/Writer是用来处理字符流的。

InputStreamReader类部分源码:

public class InputStreamReader extends Reader {
  private final StreamDecoder sd;

  public InputStreamReader(InputStream in) {
    super(in);
    try {
      sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
    } catch (UnsupportedEncodingException e) {
      throw new Error(e);
    }
  }

  public int read() throws IOException {
    return sd.read();
  }

  public int read(char cbuf[], int offset, int length) throws IOException {
    return sd.read(cbuf, offset, length);
  }
}

由源码可以看出:​
InputStreamReader是字节流 》》》 字符流的适配器。
其中,Reader即对应Target(接口或抽象类),InputStreamReader对应Adapter,
InputStream对应Adaptee。

这里写图片描述
(图片来源:http://lbwahoo.iteye.com/blog/1989579


小结:
近期仅仅了解了常用的设计模式。设计模式的学习暂且告一段落。学习设计模式不仅仅是了解设计模式的用处和概念,最重要的是学会每种设计模式的思想,将这种思想应用到自己的代码中,从而使自己的代码更加简洁,层次感,便于维护。
希望自己在工作后有机会能够深入去体会并应用学过的设计模式。
~2017/09/05 in NJ

参考:
(1)《大话设计模式》
(2)http://blog.csdn.net/jackshiny/article/details/52743260

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/noaman_wgs/article/details/77852587
个人分类: 设计模式
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭