Domain Layer擁有全部的業務邏輯。Domain層從命名爲User Case或者interactor的類開始,這些類由展現層(Presenter)來使用。這些User Case表明開發人員能夠從展現層(Presenter)執行的全部可能的操做。html
上一篇文章描述了todo-mvp,並着重描述了一下Data層。此次在此基礎上又增長了domain 層。java
按照Android-CleanArchitecture來設計。android
與以前項目最大的區別是擴展出了Domain層和許多use case。這將有助於避免Presenter上的代碼重複。git
User Case定義應用程序須要的操做(封裝了請求參數和回調結果基類)。將Data層的方法抽象到了Domain層的類,這增長了可讀性,由於類的名稱可使目的更明顯,見名知義。github
User Case更方便咱們對Domain層的代碼進行重用操做。CompleteTask集成了User Case,TaskDetailPresenter和TasksPresenter都在使用它,獲得了重用。數據庫
這些User Case的執行在後臺線程中使用命令模式來完成。Domain層與Android SDK或其餘第三方庫徹底解耦。網絡
/** * 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層須要的數據便可。dom
同時,將Presenter的方法含義抽象到類中,直觀的顯示功能操做,並封裝了RequestValues和ResponseValue。spa
這一層,既不依賴與Android SDK,也不依賴於第三方庫(網絡庫,數據庫)。線程