使用场景:功能支持两种接口模式,使用抽象类分别实现接口
1、定义抽象类及统一接口
abstract class UploadStrategy {
/// 抽象上传方法
/// [file]:待上传文件
/// [onSendProgress]:进度回调(已上传字节数,总字节数)
Future<String> upload({
required File file,
Function(int, int)? onSendProgress
});
}
2、通过创建策略工厂类(根据类型获取上传实例)
class UploadStrategyFactory {
static UploadStrategy getStrategy(
UploadApiType type) {
switch (type) {
case UploadApiType.aLiYun:
return AliYunUploader();
case UploadApiType.sam:
return SamUploader();
}
}
}
3、通过implements分别实现自定义上传接口
/// 阿里云OSS上传实现
class AliYunUploader implements UploadStrategy {
@override
Future<String> upload({
required File file,
Function(int, int)? onSendProgress
}) async {
// 复用原阿里云上传逻辑
return await AliyunOss.upload(
file: file,
onSendProgress: onSendProgress,
);
}
}
//上传实现
class SamUploader implements UploadStrategy {
@override
Future<String> upload({
required File file,
Function(int, int)? onSendProgress
}) async {
return await FileUploadService()
.uploadCommon(file);
}
}
4、使用示例:
final uploader = UploadStrategyFactory.getStrategy(uploadType);
try {
final urls = await Future.wait(
files.map(
(file) => uploader.upload(
file: file,
onSendProgress: onSendProgress,
),
),
);
UIToast.showSuccess('上传成功');
successCallback(urls);
} catch (e) {
UIToast.showError('上传失败: ${e.toString()}');
} finally {
UIToast.dismissHud();
}
总结:虽然可以通过参数方式实现不同类型接口的功能,但通过抽象类可以减少逻辑,并更加简便的使用上传方法,后期若有增加类型,也更容易维护。