【Flutter】抽象类的运用(abstract与implements的实践)
使用场景:功能支持两种接口模式,使用抽象类分别实现接口
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 {@overrideFuture<String> upload({required File file,Function(int, int)? onSendProgress}) async {// 复用原阿里云上传逻辑return await AliyunOss.upload(file: file,onSendProgress: onSendProgress,);}
}//上传实现
class SamUploader implements UploadStrategy {@overrideFuture<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();}
总结:虽然可以通过参数方式实现不同类型接口的功能,但通过抽象类可以减少逻辑,并更加简便的使用上传方法,后期若有增加类型,也更容易维护。