上一篇 我已经讲过mvc mvp 以及对比,写的有点累了,但你们就是我的红牛,我的体质能量,我的加多宝,要是女的的话也是可以是我的女朋友,但请你记住,我从不搞基,从不...
Follow Me:
如果仔细看完我上一篇文章的,特别注意下我用“#########” 来区别上一篇剥离出去的Modle
Start:代码来了
I(桥梁):
package com.example.bandofbrotherszts.ztsmvpdemostep1.cantract; /** * Created by BandOfBrothersZTS on 2017/8/22. */ public interface LoginInterface { /** ################# * 为桥梁添加Model */ interface Model{ String getData(); } /** * 接口View “即Activity(Fragment)的所实现类“ */ interface View{ //setData方法是为了 Activity实现View接口之后 重载这个方法就可以直接拿到str 给TextView赋值 void setData(String str); }; /** * 接口Presenter 是LoginPresenter的所实现类 */ interface Presenter{ //我们所要做的就是 给一个TextView 赋值,所以Presenter 中需要有一个方法loadData() // 调用 model的网络请求 void loadData(); }; /** * 温馨提示 :你也可以吧interface Presenter{} 抽象接口换成 abstract class Presenter{} * 这样的话Presenter 是LoginPresenter的父类 LoginPresenter extends Presenter 即可 * 但是本着“单继承,多实现的原则” 我还是喜欢实现 因为你可能还有别的基类对不对 */ //TODO 不要问我mvp模式 m层在哪 不要忘了咱们第一步曲 是把m层剥离出去了 //TODO 但是这并不影响, 因为Model 是通过Presenter来调用的 看看mvc和mvp的对比图就明白了 //TODO 所以第一步曲的特点在于: 通过Presenter 来直接调用静态类 进行异步请求 }
P:
package com.example.bandofbrotherszts.ztsmvpdemostep1.presenter; import com.example.bandofbrotherszts.ztsmvpdemostep1.cantract.LoginInterface; import com.example.bandofbrotherszts.ztsmvpdemostep1.model.LoginModel; /** *Created by BandOfBrothersZTS on 2017/8/22. */ public class LoginPresenter implements LoginInterface.Presenter{ /** *View 和 Presenter 是互通的 所以我要通过构造的方式拿到View * 拿到View Presenter就可以调用View中的方法了 * 嘿嘿,我又污了(拿到房卡 我就可以对里面姑娘为所欲为了!!!) */ private LoginInterface.View view; /**########### Presenter 传递信息给Model 所以要拿到它的实例 * 我直接在presenter 中实例化的 你也可以在Activity实例化,然后通过构造传过来 */ private LoginInterface.Model model; public LoginPresenter(LoginInterface.View view) { this.view = view; this.model = new LoginModel(); } /**########### 通过Model 拿到数据 * 然后通知view层 */ @Override public void loadData() { String str = model.getData(); view.setData(str); } }
M:
package com.example.bandofbrotherszts.ztsmvpdemostep1.model; import com.example.bandofbrotherszts.ztsmvpdemostep1.cantract.LoginInterface; /** * Created by BandOfBrothersZTS on 2017/8/22. * #############getData()不是静态调用了,是重写方法了 */ public class LoginModel implements LoginInterface.Model{ /** * 很简单就是网络强求数据,我比较懒所以我伪造一下数据 */ public String getData(){ return "我是伪造的网络请求数据"; }; }
V:
package com.example.bandofbrotherszts.ztsmvpdemostep1.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; import com.example.bandofbrotherszts.ztsmvpdemostep1.R; import com.example.bandofbrotherszts.ztsmvpdemostep1.cantract.LoginInterface; import com.example.bandofbrotherszts.ztsmvpdemostep1.presenter.LoginPresenter; /** * Created by BandOfBrothersZTS on 2017/8/22. */ public class LoginActivity extends AppCompatActivity implements LoginInterface.View { private LoginInterface.Presenter mPresenter; private TextView dataTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); initView(); /** * 注意了:::::::::::: * 向下转型 实例化LoginPresenter * 为什么这么写? 因为LoginInterface才是桥梁!!! */ mPresenter = new LoginPresenter(this); } private void initView() { dataTv = (TextView) findViewById(R.id.data_tv); dataTv.setOnClickListener(new View.OnClickListener() {//点击请求数据 @Override public void onClick(View v) { mPresenter.loadData(); } }); } @Override public void setData(String str) { dataTv.setText(str); } }
END:
总结: 每个人都有自己的mvp,你的参阅让我倍感荣幸,希望你也能找到自己的mvp,如需帮助,或有志同道合者想一起进步的,
加qq群:659014357
最后我附上github源码连接 :
MVP(二)源码