java多态通过抽象压缩接口(如compressor)统一compress/decompress契约,各子类(zip/gzip/targz)封装具体实现,调用方仅依赖抽象类型,无需if-else判断格式,配合工厂模式可灵活扩展新压缩算法。

Java 中用多态支持多种文件压缩格式,核心是把不同压缩逻辑抽象成统一接口,让调用方无需关心具体实现。不是靠“写 if-else 判断 zip 还是 gzip”,而是通过继承和方法重写,让 compress() 和 decompress() 行为在运行时自动匹配实际类型。
压缩行为抽象成接口或父类
定义一个通用的压缩操作契约,比如:
public abstract class Compressor {
public abstract void compress(String source, String target) throws IOException;
public abstract void decompress(String source, String target) throws IOException;
}
这个抽象类不关心底层用的是 ZIP 还是 GZIP,只声明“能压、能解”。
各种压缩格式对应具体子类
每个子类专注一种格式,封装 Java 原生 API 细节:
-
ZipCompressor:用
ZipOutputStream/ZipInputStream,支持多文件、目录结构、条目元信息(如时间、注释) -
GzipCompressor:用
GZIPOutputStream/GZIPInputStream,只处理单个文件,不带归档能力 - (可选)TarGzCompressor:先
TarOutputStream打包,再套GZIPOutputStream—— 体现组合优于继承,也符合多态扩展性
每个子类都重写 compress() 和 decompress(),内部调用各自对应的流类,比如:
public class ZipCompressor extends Compressor {
@Override
public void compress(String source, String target) throws IOException {
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(target))) {
// 递归遍历 source 目录,为每个文件创建 ZipEntry 并写入
}
}
@Override
public void decompress(String source, String target) throws IOException {
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(source))) {
// 逐个读 ZipEntry,还原文件路径并写出
}
}
}
调用端只依赖抽象,不耦合具体实现
业务代码完全不用改,就能切换压缩方式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Compressor compressor = new ZipCompressor(); // 或 new GzipCompressor()
compressor.compress("input/", "output.zip");
compressor.decompress("output.zip", "extracted/");
如果后续加了 Bzip2Compressor 或 ZstdCompressor,只要它继承 Compressor,上面这三行代码照常运行 —— 这就是多态带来的可扩展性与解耦。
配合工厂或策略模式更实用
实际项目中,通常不会硬编码 new ZipCompressor(),而是用简单工厂或配置驱动:
public class CompressorFactory {
public static Compressor getCompressor(String format) {
return switch (format.toLowerCase()) {
case "zip" -> new ZipCompressor();
case "gzip" -> new GzipCompressor();
default -> throw new IllegalArgumentException("Unsupported format: " + format);
};
}
}
然后这样用:
Compressor c = CompressorFactory.getCompressor("gzip");
c.compress("data.txt", "data.txt.gz");
此时多态 + 工厂,既保持调用简洁,又避免条件分支污染业务逻辑。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










