MVP模式简易封装

MVP 全称:Model-View-Presenter ;

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示 ,MVP模式隔绝了View层和Model层间的通信,两者间交互通过中间层Presenter,降低了耦合度。

以下代码是基于mvp模式实现的简易封装:

1.定义baseview

public abstract class BaseFragment<T extends BasePresenter> extends Fragment {

    protected Context mContext;
    protected View mParentView;
    public T mPresenter;

    @Override
    public void onAttach(Context context) {
        this.mContext = context;
        super.onAttach(context);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mParentView = inflater.inflate(getContainerViewId(), container, false);
        mPresenter = initPresenter();
        init();
        return mParentView;
    }

    @Override
    public void onDestroy() {
        if (mPresenter != null) {
            mPresenter.detachView();
        }
        super.onDestroy();
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mContext = null;
    }

    protected abstract int getContainerViewId();

    public abstract T initPresenter();

    protected abstract void init();
}

2.定义basepresenter

public class BasePresenter<V> {
    public WeakReference<V> mView;

    public BasePresenter(V view) {
        mView = new WeakReference<V>(view);
    }

    public void detachView() {
        if (mView != null) {
            unRegisterListener();
            mView.clear();
            mView = null;
        }
    }

    public void unRegisterListener() {

    }
}

3.定义DemoPresenter实现BasePresenter

public class DemoPresenter extends BasePresenter<DemoContract.View> implements DemoContract.Presenter ,  
      OnDataChangeListener{

    private DemoModel mStockModel;

    public DemoPresenter(DemoContract.View view) {
        super(view);
        mStockModel = DemoModel.getInstance();
        mStockModel.registerDataChangeListener(this);
    }

    @Override
    public void getData() {
        mStockModel.getData();
    }

    @Override
    public void onDataCallBack( List<ResponseData> responseDatas) {
        mView.get().updateUI(event, responseDatas);
    }

    @Override
    public void unRegisterListener() {
        mStockModel.unRegisterDataChangeListener(this);
    }
}

4.定义Model

public class DemoModel {
    private static DemoModel mInstance;
    private List<OnDataChangeListener> mOnDataChangeListeners;
    private Handler mHandler = new Handler();

    public static DemoModel getInstance() {
        if (mInstance == null) {
            synchronized (DemoModel.class) {
                if (mInstance == null) {
                    mInstance = new DemoModel();
                }
            }
        }
        return mInstance;
    }

    private DemoModel() {
    }

    public void getData() {
        //假数据
        notifyDataChanged(responseData);
    }

    private void notifyDataChanged(final List<String> responseData) {
        if (mOnDataChangeListeners != null) {
            for (final OnDataChangeListener onDataChangeListener : mOnDataChangeListeners) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        onDataChangeListener.onDataCallBack( responseData);
                    }
                });
            }
        }
    }

    public void registerDataChangeListener(OnDataChangeListener onDataChangeListener) {
        if (mOnDataChangeListeners == null) {
            mOnDataChangeListeners = new ArrayList<>();
        }
        if (!mOnDataChangeListeners.contains(onDataChangeListener)) {
            mOnDataChangeListeners.add(onDataChangeListener);
        }
    }

    public void unRegisterDataChangeListener(OnDataChangeListener onDataChangeListener) {
        if (mOnDataChangeListeners != null && mOnDataChangeListeners.contains(onDataChangeListener)) {
            mOnDataChangeListeners.remove(onDataChangeListener);
        }
    }

}

5.View层

public class DemoFragment<DemoPresenter> extends BaseFragment implements  DemoContract.View{

    public static DemoFragment newsInstance() {
        return new DemoFragment();
    }

    @Override
    protected int getContainerViewId() {
        return R.layout.extend_fragment_weather;
    }

    @Override
    public DemoPresenter initPresenter() {
        return new DemoPresenter();
    }

    @Override
    protected void init() {

    }

    @Override
    public void showDialog() {
        //todo
    }
}

编写完毕,可直接借鉴使用!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值