Android-Architecture 之 todo-mvp-clean

小編發表於2019-02-28

Domain Layer擁有所有的業務邏輯。Domain層從命名為User Case或者interactor的類開始,這些類由展示層(Presenter)來使用。這些User Case代表開發人員可以從展示層(Presenter)執行的所有可能的操作。

上一篇文章描述了todo-mvp,並著重描述了一下Data層。這次在此基礎上又增加了domain 層。

按照Android-CleanArchitecture來設計。

Android-Architecture 之 todo-mvp-clean
Paste_Image.png

主要概念

與之前專案最大的區別是擴充套件出了Domain層和許多use case。這將有助於避免Presenter上的程式碼重複。

User Case定義應用程式需要的操作(封裝了請求引數和回撥結果基類)。將Data層的方法抽象到了Domain層的類,這增加了可讀性,因為類的名稱可以使目的更明顯,見名知義。

User Case更方便我們對Domain層的程式碼進行重用操作。CompleteTask整合了User Case,TaskDetailPresenter和TasksPresenter都在使用它,得到了重用。

這些User Case的執行在後臺執行緒中使用命令模式來完成。Domain層與Android SDK或其他第三方庫完全解耦。

示例程式碼

UserCase


/**
 * Use cases are the entry points to the domain layer.
 *
 * @param <Q> the request type
 * @param <P> the response type
 */
public abstract class UseCase<Q extends UseCase.RequestValues, P extends UseCase.ResponseValue> {

    private Q mRequestValues;

    private UseCaseCallback<P> mUseCaseCallback;

    public void setRequestValues(Q requestValues) {
        mRequestValues = requestValues;
    }

    public Q getRequestValues() {
        return mRequestValues;
    }

    public UseCaseCallback<P> getUseCaseCallback() {
        return mUseCaseCallback;
    }

    public void setUseCaseCallback(UseCaseCallback<P> useCaseCallback) {
        mUseCaseCallback = useCaseCallback;
    }

    void run() {
       executeUseCase(mRequestValues);
    }

    //呼叫Data層API,發起請求
    protected abstract void executeUseCase(Q requestValues);

    /**
     * Data passed to a request.
     */
    public interface RequestValues {
    }

    /**
     * Data received from a request.
     */
    public interface ResponseValue {
    }

    public interface UseCaseCallback<R> {
        void onSuccess(R response);
        void onError();
    }
}複製程式碼

雜談

Domain層是對Data層和Presenter層之間的資料處理和操作加工。對於複雜的專案而言,上層UI和底層資料的變動頻繁,導致UI和資料經常對不上號。因而中間層可以對資料進行一層過濾操作。拿到網路資料,加工成Presenter層需要的資料即可。

同時,將Presenter的方法含義抽象到類中,直觀的顯示功能操作,並封裝了RequestValues和ResponseValue。

這一層,既不依賴與Android SDK,也不依賴於第三方庫(網路庫,資料庫)。

相關文章