java - 我如何 DRY Android 改装电话?
问题描述
我的代码中有几个存储库类。
例如,这是 UserRepository:
public class UserRepository {
public static String TAG = "UserRepository";
ApiService mApiService;
SharedPreferences mPrefs;
Context mContext;
RemoteDataSource<User> mRemoteDataSource;
public UserRepository() {
mApiService = new RetrofitClient().getApiService();
mContext = App.getAppContext();
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mRemoteDataSource = new RemoteDataSource<>();
}
public RemoteDataSource getRemoteDataSource() {
mRemoteDataSource.setIsLoading();
Call<ApiResponse> userCall = mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));
userCall.enqueue(new Callback<ApiResponse>() {
@Override
public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
mRemoteDataSource.setIsLoaded();
mRemoteDataSource.setData(response.body().getUser());
mRemoteDataSource.setStatus(response.body().getStatus());
mRemoteDataSource.setMessage(response.body().getMessage());
}
@Override
public void onFailure(Call<ApiResponse> call, Throwable t) {
Log.e(TAG, t.getMessage());
mRemoteDataSource.setFailed(t.getMessage());
}
});
return mRemoteDataSource;
}
}
这是 BonusRepository:
public class BonusRepository {
public static String TAG = "BonusRepository";
ApiService mApiService;
SharedPreferences mPrefs;
Context mContext;
LiveData<Bonus> mBonus;
String mId;
RemoteDataSource<Bonus> mRemoteDataSource;
public BonusRepository(String id) {
mId = id;
mApiService = new RetrofitClient().getApiService();
mContext = App.getAppContext();
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mRemoteDataSource = new RemoteDataSource<>();
}
public RemoteDataSource getRemoteDataSource() {
mRemoteDataSource.setIsLoading();
Call<ApiResponse> bonusCall = mApiService.getBonus(mPrefs.getString(User.TOKEN_NAME, null), mId);
bonusCall.enqueue(new Callback<ApiResponse>() {
@Override
public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
mRemoteDataSource.setIsLoaded();
mRemoteDataSource.setData(response.body().getBonus());
mRemoteDataSource.setStatus(response.body().getStatus());
mRemoteDataSource.setMessage(response.body().getMessage());
}
@Override
public void onFailure(Call<ApiResponse> call, Throwable t) {
Log.e(TAG, t.getMessage());
mRemoteDataSource.setFailed(t.getMessage());
}
});
return mRemoteDataSource;
}
}
getRemoteDataSource
两个类中的方法是相等的,除了
Call<ApiResponse> userCall = mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));
并mRemoteDataSource.setData(response.body().getUser());
在用户存储库中
不同于:
Call<ApiResponse> bonusCall = ApiService.getBonus(mPrefs.getString(User.TOKEN_NAME, null), mId);
mRemoteDataSource.setData(response.body().getBonus());
在 BonusRepository 中。
在其他存储库中,我有类似的重复代码。
我想删除这个重复,但没有找到任何好的解决方案。
干燥我的代码的最佳方法是什么?
解决方案
为所有存储库创建一个抽象类父级,并实现getRemoteDataSource()方法,调用一个新的抽象方法,这将是每个特定实现中唯一的特定方法。
例如:
public class AbstractRepository {
protected abstract Call<ApiResponse> performCall();
public RemoteDataSource getRemoteDataSource() {
mRemoteDataSource.setIsLoading();
Call<ApiResponse> userCall = performCall();
userCall.enqueue(new Callback<ApiResponse>() {
@Override
public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
mRemoteDataSource.setIsLoaded();
mRemoteDataSource.setData(response.body().getUser());
mRemoteDataSource.setStatus(response.body().getStatus());
mRemoteDataSource.setMessage(response.body().getMessage());
}
@Override
public void onFailure(Call<ApiResponse> call, Throwable t) {
Log.e(TAG, t.getMessage());
mRemoteDataSource.setFailed(t.getMessage());
}
});
return mRemoteDataSource;
}
}
然后您可以执行以下操作:
public class UserRepository extends AbstractRepository {
public static String TAG = "UserRepository";
ApiService mApiService;
SharedPreferences mPrefs;
Context mContext;
RemoteDataSource<User> mRemoteDataSource;
public UserRepository() {
mApiService = new RetrofitClient().getApiService();
mContext = App.getAppContext();
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mRemoteDataSource = new RemoteDataSource<>();
}
protected Call<ApiResponse> performCall() {
return mApiService.getUserInfo(mPrefs.getString(User.TOKEN_NAME, null));
}
}
我让你适应你的需求,但这是最好的解决方案。
推荐阅读
- php - 如何获取结果在laravel中多个一对多关系根据用户的角色获取数据
- c# - 为什么我必须为异步查询多次编写等待?
- java - 检查对象的最佳方法是什么,它的成员在Java中为空
- php - Instagram 新 API - 如何使用纯 PHP 代码获取授权代码
- sql - Sql中排除两个连续条件的数据
- python - TensorBoard 未找到标量数据
- javascript - 如何使用 d3js 和 reactjs 在饼图中将标签显示为工具提示
- android - 如何使用来自 mobile-buy-sdk-android 的查询获取博客列表
- scala - 使用 elastic4s 创建索引设置
- java - 单选按钮不返回值 JSP