1. 什么是装饰者模式?
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
2.装饰者模式的类图
3. 为何装饰者和被装饰者有相同的“接口”?
因为装饰者必须能够取代被装饰者
例子:
jdk中的io是众所周知的装饰者模式,此处编写自己的java i/o 装饰者 把输入流内的所有大写字符转换成小写
package decorator_io;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 编写自己的java i/o 装饰者 把输入流内的所有大写字符转换成小写
*
* @author chenhong
*
*
* */
public class LowerCaseInputStream extends FilterInputStream {
protected LowerCaseInputStream(InputStream in) {
super(in);
// TODO Auto-generated constructor stub
}
/**
* 读取单个字符
*
* */
public int read() throws IOException {
int c = super.read();
return c == -1 ? c : Character.toLowerCase(c);
}
/**
* 读取字符数组
* */
public int read(byte[] b, int offset, int len) throws IOException {
int result = super.read(b, offset, len);
for (int i = offset; i < offset + result; ++i) {
b[i] = (byte) Character.toLowerCase(b[i]);
}
return result;
}
}
package decorator_io;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test {
public static void main(String[] args) {
int c;
try {
InputStream in = new LowerCaseInputStream(new BufferedInputStream(
new FileInputStream("src/decorator_io/Test.java")));
while ((c = in.read()) > 0) {
System.out.print((char) c);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}