代码之家  ›  专栏  ›  技术社区  ›  igor_rb

我怎样才能干安卓改装电话?

  •  2
  • igor_rb  · 技术社区  · 6 年前

    我的代码中有几个存储库类。

    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;
    }
    
    }
    

    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());

    在其他存储库中,我有类似的重复代码。

    我想删除这个重复,但没有找到任何好的解决办法。

    干代码的最好方法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Bsquare ℬℬ    6 年前

    为所有存储库创建一个抽象类父级,并实现 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));
    }
    

    我让你适应你的需要,但这是最好的解决办法。