MVP思想实现项目基础框架搭建

本文用MVP思想实现项目基础框架搭建,并用登录功能做例子,供参考。

框架
在这里插入图片描述
部分代码

BaseView.java

// View层基类
public abstract class BaseView<P extends BasePresenter, CONTRACT> extends Activity {

    protected P p;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 弱引用
        p = getPresenter();
        // 绑定
        p.bindView(this);
    }

    // 让P层做什么需求
    public abstract CONTRACT getContract();

    // 从子类中获取具体的契约
    public abstract P getPresenter();

    // 如果Presenter层出现了异常,需要告知View层
    public void error(Exception e) {}

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 解除绑定
        p.unBindView();
    }
}

BasePresenter.java

// Presenter基类
public abstract class BasePresenter<V extends BaseView, M extends BaseModel, CONTRACT> {

    protected M m;
    // 绑定View层弱引用
    private WeakReference<V> vWeakReference;

    public BasePresenter() {
        m = getModel();
    }

    public void bindView(V v) {
        vWeakReference = new WeakReference<>(v);
    }

    public void unBindView() {
        if (vWeakReference != null) {
            vWeakReference.clear();
            vWeakReference = null;
            System.gc();
        }
    }

    // 获取View,P -- V
    public V getView() {
        if (vWeakReference != null) {
            return vWeakReference.get();
        }
        return null;
    }

    // 获取子类具体契约(Model层和View层协商的共同业务)
    public abstract CONTRACT getContract();

    public abstract M getModel();
}

BaseModel.java

// 接收到P层交给它的需求(基类)
public abstract class BaseModel<P extends BasePresenter, CONTRACT> {

    protected P p;

    // 业务结束,通过Presenter调用契约、合同(接口中的方法)void responseResult(T t)

    public BaseModel(P p) {
        this.p = p;
    }

    public abstract CONTRACT getContract();
}

LoginContract.java

// 将Model层、View层、Presenter层协商的共同业务,封装成接口
// 契约、合同
public interface LoginContract {

    interface Model {
        // Model层子类完成方法的具体实现----------------2
        void executeLogin(String name, String pwd) throws Exception;
    }

    interface View<T extends BaseEntity> {
        // 真实的项目中,请求结果往往是以javabean--------------4
        void handlerResult(T t);
    }

    interface Presenter<T extends BaseEntity> {
        // 登录请求(接收到View层指令,可以自己做,也可以让Model层去执行)-----------1
        void requestLogin(String name, String pwd);

        // 结果响应(接收到Model层处理的结果,通知View层刷新)---------------3
        void responseResult(T t);
    }
}

LoginMode.java

// 接收到P层交给它的需求
public class LoginMode extends BaseModel<LoginPresenter, LoginContract.Model> {

    public LoginMode(LoginPresenter loginPresenter) {
        super(loginPresenter);
    }

    @Override
    public LoginContract.Model getContract() {
        return (name, pwd) -> {
            if ("lianren".equalsIgnoreCase(name) && "100".equals(pwd)) {
                p.getContract().responseResult(new UserInfo("联仁", "孙老师"));
            } else {
                p.getContract().responseResult(null);
            }
        };
    }
}

LoginPresenter.java

public class LoginPresenter extends BasePresenter<LoginActivity, LoginMode, LoginContract.Presenter> {

    @Override
    public LoginContract.Presenter getContract() {
        // 既要履行View给它的需求,又要分配工作给Model去完成这个需求
        return new LoginContract.Presenter<UserInfo>() {
            @Override
            public void requestLogin(String name, String pwd) {
                try {
                    // 三种风格(P层很极端,要么不做事只做转发,要么就是拼命一个人干活)
                    m.getContract().executeLogin(name, pwd);

                    // 第二种,让功能模块去工作(Library:下载、请求、图片加载)
//                    HttpEngine engine = new HttpEngine<>(LoginPresenter.this);
//                    engine.post(name, pwd);

                    // P层自己处理(谷歌例子)
//                    if ("netease".equalsIgnoreCase(name) && "163".equals(pwd)) {
//                        responseResult(new UserInfo("讯飞", "陈老师"));
//                    } else {
//                        responseResult(null);
//                    }

                    // 内存泄露测试
//                    new Thread(new Runnable() {
//                        @Override
//                        public void run() {
//                            SystemClock.sleep(50000);
//                        }
//                    }).start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void responseResult(UserInfo userInfo) {
                // 不管谁完成需求,有结果就告知View层
                getView().getContract().handlerResult(userInfo);
            }
        };
    }

    @Override
    public LoginMode getModel() {
        return new LoginMode(this);
    }
}

效果图
在这里插入图片描述

Demo下载地址


MVP思想精髓与解耦(Kotlin)
MVP思想实现项目基础框架搭建

架构师系列文章一览

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小瓯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值