自定义加密输入流代码
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
public class EncryptedFilterInputStream extends FilterInputStream {
private static final int SHIFT = 3;
public EncryptedFilterInputStream(InputStream in) {
super(in);
}
@Override
public int read() throws IOException {
int data = super.read();
if (data != -1) {
return (data + SHIFT) % 256;
}
return data;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
int bytesRead = super.read(b, off, len);
if (bytesRead != -1) {
for (int i = 0; i < bytesRead; i++) {
b[off + i] = (byte) ((b[off + i] + SHIFT) % 256);
}
}
return bytesRead;
}
}
可能结合的设计模式及结合方式
- 装饰器模式
- 结合方式:上述自定义的
EncryptedFilterInputStream
类本身就体现了装饰器模式。FilterInputStream
是装饰器模式中的抽象装饰类,EncryptedFilterInputStream
是具体的装饰类。在实际项目中,可以通过层层包装不同功能的装饰器(如不同加密方式的输入流装饰器、日志记录输入流装饰器等)来增强InputStream
的功能,提高代码的可维护性和扩展性。例如,如果后续需要添加解密功能,可以再创建一个继承自FilterInputStream
的DecryptedFilterInputStream
装饰器,在读取数据时进行解密操作,与EncryptedFilterInputStream
可以灵活组合使用。
- 策略模式
- 结合方式:可以将不同的加密策略(如不同的移位值、不同的加密算法)封装成不同的策略类。在
EncryptedFilterInputStream
中,通过一个策略接口来引用具体的加密策略对象。这样,在实际项目中,如果需要更换加密算法,只需要创建新的策略类实现加密策略接口,然后在EncryptedFilterInputStream
中切换使用的策略对象即可,无需修改EncryptedFilterInputStream
的核心读取逻辑,提高了代码的扩展性和可维护性。例如,创建ShiftEncryptionStrategy
和XOREncryptionStrategy
等不同策略类,在EncryptedFilterInputStream
的构造函数中传入不同的策略对象来实现不同的加密策略。