Java设计模式-适配器模式和装饰模式

来源:互联网 发布:穷养儿富养女知乎 编辑:程序博客网 时间:2024/06/06 05:38

设计模式的概念:

用通用的方法去解决抽象问题的一种方式就是设计模式;

适配器模式

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

描述


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

记住 InputStreamReader / OutputStreamWriter 是连通字节与字符的桥梁。XxxReader(InputStream / OutputStream / Writer) 则是连通某一类操作与输入输出流的桥梁。


装饰模式

java io 这个包里有一个类,比较特别,这就是BufferedReader。我们从JDK的源码里,找到它的实现:

public class BufferedReader extends Reader {    public BufferedReader(Reader in, int sz) {        super(in);        if (sz <= 0)            throw new IllegalArgumentException("Buffer size <= 0");        this.in = in;        cb = new char[sz];        nextChar = nChars = 0;    }}

可以看到,BufferedReader本身就是一个Reader,因为它继承自Reader,同时,还有一个名为 in 的成员变量,也是Reader类型的,然后还开辟了一个数组。实际上,这个数组是为了做缓存的,我们可以一次从 in 这个成员对象中读取多个字符存入 cb 中。当真正调用BufferedReader 的 read 方法的时候,就直接从 cb 中读取了,提高了读取的性能。也就是说BufferedReader所提供的 read 方法经过了 cb 这个缓存的加速,其性能会高于直接从 in 这个对象去读取。这是一种增强普通的 Reader 对象的技术。

bufferReader在对Reader做增强的时候只是对reader类做了增强,而不是针对于某一个具体的类,源码中的in这个变量可以是FileReader也可以是SocketReader,这种对于接口保持不变,又对子类的功能进行了增强,这种方式就是装饰者模式;
装饰者模式

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));则以后就可直接使用br进行读入;

阅读全文
0 0
原创粉丝点击