1、简介
1.1 概念
创建一个新类,包装原始类,从而在新类中提升原来类的功能。
1.2 作用
装饰模式指的是在不改变原类的基础上, 动态地扩展一个类的功能。
例如
InputStream(抽象父类)
FileInputStream(实现子类,读写性能较差)
BufferedInputStream(实现子类,装饰类,读写性能高)
2、装饰模式设计
2.1 步骤
定义父类。
定义原始类,继承父类,定义功能。
定义装饰类,继承父类,包装原始类,增强功能!!
2.2 示例
package com.decorator;
/*
共同父类
*/
public abstract class InputStream {
public abstract int read();
public abstract int read(byte[] buffer);
}
package com.decorator;
import java.util.Arrays;
/*
原始类
*/
public class FileInputStream extends InputStream{
@Override
public int read() {
System.out.println("低性能方式读取了一个字节a");
return 97;
}
@Override
public int read(byte[] buffer) {
buffer[0] = 97;
buffer[1] = 98;
buffer[2] = 99;
System.out.println("低性能方式读取了一个字节数组"+ Arrays.toString(buffer));
return 3;
}
}
package com.decorator;
/*
装饰类:继承父类InputStream,拓展原始类的功能
*/
public class BufferInputStream extends InputStream{
private InputStream is;
public BufferInputStream(InputStream is){
this.is = is;
}
@Override
public int read() {
System.out.println("提供8KB的缓冲区,提高读数据性能");
return is.read();
}
@Override
public int read(byte[] buffer) {
System.out.println("提供8KB的缓冲区,提高读数据性能");
return is.read(buffer);
}
}
package com.decorator;
public class DecoratorDemo01 {
public static void main(String[] args) {
InputStream is = new BufferInputStream(new FileInputStream());
System.out.println(is.read());
System.out.println(is.read(new byte[3]));
}
}
测试结果
提供8KB的缓冲区,提高读数据性能
低性能方式读取了一个字节a
97
提供8KB的缓冲区,提高读数据性能
低性能方式读取了一个字节数组[97, 98, 99]
3