MVP自定义设计

来源:互联网 发布:html ccs js 编辑:程序博客网 时间:2024/06/07 22:26

MVP自定义设计

mmp!


1.MVP构成

在MVP模式里通常包含4个要素:

  1. View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
  2. View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
  3. Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
    4.Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

2.MVP原则

  • Activity,Fragment 和 自定义视图是应用的 View 部分; 每一个 View 都有一个单独的 Presenter,通过接口通信。

  • Presenter不访问任何 Android API,只通过接口和 DataManager 交互。 DataManager 只在被调用的时候提供服务。

  • View interface一种接口,被 View 实现。它包括暴露给 Presenter 的方法。

  • Model 被分为以下几类

    • AppDbHelper:数据库管理类,负责所有和数据库有关的操作。 AppDbHelper 实现的接口,包括提供给应用的方法。这一层对 DbHelper 的任何特定实现进行了解耦,这使得 AppDbHelper 成为了一个即插即用的单元。

    • AppPreferenceHelper:类似于 AppDbHelper,只不过提供的是对于 SharedPreferences 的读写操作。

    • PreferenceHelper:类似于 DbHelper 的接口,被 AppPreferenceHelper 实现。

    • AppApiHelper:管理网络 API 请求及其数据处理。

    • ApiHelper:类似于 DbHelper 的接口,被 AppApiHelper 实现。

    • DataManager:被 AppDataManager 实现的接口。包括所有数据处理操作。理想情况下,它负责委派所有 Helper 的服务。所以DataManager 继承 DbHelper,PreferenceHelper 和 ApiHelper。

    • AppDataManager:它是应用中所有数据操作的结合点。DbHelper,PreferenceHelper 和 ApiHelper 只为 DataManager 提供服务。它负责委派任务给指定的 Helper。

现在我们对于各种组件和它们的职责都熟悉了。我们马上将制定组件间的交互规则。

Application 类实例化 AppDbHelper(通过 DbHelper 引用),AppPreferenceHelper(通过 PreferenceHelper 引用),AppApiHelper(通过 ApiHelper 引用)以及最终的 AppDataManager(通过 DataManager 引用)。

View 组件实例化它的 Presenter 并通过Presenter 引用。

Presenter 通过参数接受 View 组件,并用 View 引用,Presenter 也接受 DataManager。

DataManager 是单例。


3.MVP模式样例

(1)ICallBack

public interface ICallBack<T> {    /**     * 数据请求成功     * @param data 请求到的数据     */    void onSuccess(T data);    /**     *  使用网络API接口请求方式时,虽然已经请求成功但是由     *  于{@code msg}的原因无法正常返回数据。     */    void onFailure(String msg);    /**     * 请求数据失败,指在请求网络API接口请求方式时,出现无法联网、     * 缺少权限,内存泄露等原因导致无法连接到请求数据源。     */    void onError();    /**     * 当请求数据结束时,无论请求结果是成功,失败或是抛出异常都会执行此方法给用户做处理,通常做网络     * 请求时可以在此处隐藏“正在加载”的等待控件     */    void onComplete();}

(2)BaseView

public interface BaseView {    /**     * 显示正在加载view     */     void showLoading();    /**     * 关闭正在加载view     */    void hideLoading();    /**     * 显示提示     * @param msg     */    void showToast(String msg);    /**     * 显示请求错误提示     */    void showErr();    /**     * 获取上下文     * @return 上下文     */    Context getContext();}

(3)BasePresenter

public class  BasePresenter<V extends BaseView> {    /**     * 绑定的view     */    private V mvpView;    public void attachView(V mvpView) {        this.mvpView = mvpView;    }    public void detachView() {        this.mvpView = null;    }    public boolean isViewAttached() {        return mvpView != null;    }    public V getView() {        return mvpView;    }}

(4)BaseModel

public abstract class BaseModel<T>  {    //数据请求参数    protected String[] mParams;    /**     * 设置数据请求参数     * @param args 参数数组     */    public  BaseModel params(String... args){        mParams = args;        return this;    }    // 添加Callback并执行数据请求    // 具体的数据请求由子类实现    public abstract void execute(ICallBack<T> callback);    // 执行Get网络请求,此类看需求由自己选择写与不写    protected void requestGetAPI(String url,ICallBack<T> callback){        //这里写具体的网络请求    }    // 执行Post网络请求,此类看需求由自己选择写与不写    protected void requestPostAPI(String url, Map params, ICallBack<T> callback){        //这里写具体的网络请求    }}

(5)BaseActivity

public abstract class BaseActivity extends Activity implements BaseView {    private ProgressDialog mProgressDialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mProgressDialog = new ProgressDialog(this);        mProgressDialog.setCancelable(false);    }    @Override    public void showLoading() {        if (!mProgressDialog.isShowing()) {            mProgressDialog.show();        }    }    @Override    public void hideLoading() {        if (mProgressDialog.isShowing()) {            mProgressDialog.dismiss();        }    }    @Override    public void showToast(String msg) {        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();    }    @Override    public void showErr() {        showToast("error");    }    @Override    public Context getContext() {        return BaseActivity.this;    }}

(6)BaseFragment

public abstract class BaseFragment extends Fragment implements BaseView {    public abstract int getContentViewId();    protected abstract void initAllMembersView(Bundle savedInstanceState);    protected Context mContext;    protected View mRootView;    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        mRootView = inflater.inflate(getContentViewId(), container, false);        this.mContext = getActivity();        initAllMembersView(savedInstanceState);        return mRootView;    }   /* @Override    public void showLoading() {        checkActivityAttached();        ((BaseFragmentActivity) mContext).showLoading();    }    @Override    public void showLoading(String msg) {        checkActivityAttached();        ((BaseActivity) mContext).showLoading(msg);    }    @Override    public void hideLoading() {        checkActivityAttached();        ((BaseActivity) mContext).hideLoading();    }    @Override    public void showToast(String msg) {        checkActivityAttached();        ((BaseActivity) mContext).showToast(msg);    }    @Override    public void showErr() {        checkActivityAttached();        ((BaseActivity) mContext).showErr();    }*/    protected boolean isAttachedContext(){        return getActivity() != null;    }    /**     * 检查activity连接情况     */    public void checkActivityAttached() {        if (getActivity() == null) {            throw new ActivityNotAttachedException();        }    }    public static class ActivityNotAttachedException extends RuntimeException {        public ActivityNotAttachedException() {            super("Fragment has disconnected from Activity ! - -.");        }    }}

4.结尾

地狱空荡荡,魔鬼在人间。

原创粉丝点击