租赁房产图片上传Service方法的图片类型区分最优方案咨询
最优解决方案:基于枚举+策略的可扩展图片上传实现
针对你的问题,推荐使用枚举封装图片类型与对应更新逻辑的方案,既能消除重复代码,又能保证后续新增图片类型时的扩展性。
1. 定义图片类型枚举
将每种图片类型对应的DAO更新逻辑封装到枚举中,枚举作为类型标识的同时承担策略角色:
public enum RentalImageType { BEDROOM("BedroomImageId") { @Override public void updateImageId(RentalDao rentalDao, String imageId, Long rentalId) { rentalDao.updateBedroomImageId(imageId, rentalId); } }, BATHROOM("BathroomImageId") { @Override public void updateImageId(RentalDao rentalDao, String imageId, Long rentalId) { rentalDao.updateBathroomImageId(imageId, rentalId); } }, // 未来新增车库、庭院等类型时,直接添加枚举值即可 GARAGE("GarageImageId") { @Override public void updateImageId(RentalDao rentalDao, String imageId, Long rentalId) { rentalDao.updateGarageImageId(imageId, rentalId); } }; private final String dbColumnName; RentalImageType(String dbColumnName) { this.dbColumnName = dbColumnName; } // 抽象方法:由各枚举实现对应DAO更新逻辑 public abstract void updateImageId(RentalDao rentalDao, String imageId, Long rentalId); public String getDbColumnName() { return dbColumnName; } }
2. 改造Service层方法
将枚举作为参数传入,抽离通用逻辑,类型专属逻辑交给枚举处理:
public void uploadRentalImage(Long rentalId, MultipartFile file, RentalImageType imageType) { // 通用逻辑:生成唯一图片ID String imageId = UUID.randomUUID().toString(); // 通用逻辑:文件存储(如上传至对象存储、本地磁盘等,此处省略具体实现) // saveFileToStorage(file, imageId); // 调用枚举封装的类型专属更新逻辑 imageType.updateImageId(rentalDao, imageId, rentalId); }
3. 调用示例
业务层调用时直接指定枚举类型,语义清晰且类型安全:
// 上传卧室图片 rentalImageService.uploadRentalImage(rentalId, bedroomFile, RentalImageType.BEDROOM); // 上传浴室图片 rentalImageService.uploadRentalImage(rentalId, bathroomFile, RentalImageType.BATHROOM);
方案优势
- 无重复代码:生成ID、文件存储等通用逻辑仅需实现一次,避免冗余
- 扩展性强:新增图片类型时,仅需在枚举中添加新值并实现对应DAO更新方法,无需修改Service核心逻辑
- 类型安全:通过枚举约束参数,避免传入非法类型字符串,编译期即可发现错误
- 语义清晰:枚举名直接表达图片类型,代码可读性高
内容的提问来源于stack exchange,提问作者Clippit
相关产品推荐
相关产品推荐

