Android开发之初识MVP模式

来源:互联网 发布:阿里巴巴数据库在哪 编辑:程序博客网 时间:2024/05/17 01:47

这里写图片描述
各位亲爱的小伙伴,有没有想我啊,我胡汉wing又回来了。
很长一段时间没有更新博客。。原因是。。从离职回到学校以后,一直在享受最后的学生时光(打游戏).. 游戏固然很爽,但是觉得实在很荒废,于是半夜诈个尸..学习一下流行的MVP模式,就拿我刚学Android的项目“wifi密码读取器”开刀吧。。以前的代码很烂,所以来个彻底的重构…

MVP模式

mvp模式的介绍网上有很多,这里在简述一下:

MVP即 Model View Presenter, 他与MVC的区别在于在MVP里面View和Model不直接进行交互,完全交给Presenter。这样Activity就真实的成为了一个View,逻辑任务交给Presenter处理。不再是以前Activity即充当View又冲当Controller的情况。

简单来说如下图(盗来的,出自鸿洋大大这篇博客):
这里写图片描述

学习编写

简单的了解了一下MVP以后,开始拿“wifi密码读取器”开刀(wifi密码读取器是一款能够读取手机wifi密码的应用,配合万能钥匙使用更赞哦。。)

明确需求

进行第一部分的编写实现,需求如下图:
这里写图片描述

基本就是:
+ 初始化listview的内容
+ 为FloatingActionButton添加监听

代码的编写

首先,来一个实体Bean

public class WifiBean {    private String mSsid = "";    private String mComment = "";    private String mKey = "";    public String getmSsid() {        return mSsid;    }    public void setmSsid(String mSsid) {        this.mSsid = mSsid;    }    public String getmComment() {        return mComment;    }    public void setmComment(String mComment) {        this.mComment = mComment;    }    public String getmKey() {        return mKey;    }    public void setmKey(String mKey) {        this.mKey = mKey;    }}

Model层,主要用于数据的获取或者其他增删操作

public interface IWifiModel {    ArrayList<WifiBean> getWifis();    void addWifi(WifiBean wifiBean);    void delWifi(WifiBean wifiBean);}public class WifiModelImpl implements IWifiModel {    @Override    //这里模拟实现从手机读取出wifi的密码    public ArrayList<WifiBean> getWifis() {        ArrayList<WifiBean> list = new ArrayList<>();        for(int i = 0 ;i<5;i++) {            list.add(new WifiBean());        }        return list;    }    @Override    public void addWifi(WifiBean wifiBean) {    }    @Override    public void delWifi(WifiBean wifiBean) {    }}

View层,主要表明view要做哪些事情

public interface IWifiView {    void setListViewData(ArrayList<WifiBean> list);    void showSnackbar(View view);}

因为Activity即为View,所以让Activity实现这个接口,并且实现view的方法。

public class MainActivity extends AppCompatActivity implements IWifiView{    private ListView mListView;    private WifiAdapter mWifiAdapter;    //包含一个presenter    private WifiPresenterImpl mWifiPresenter;    private Toolbar mToolbar;    private FloatingActionButton mFAB;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //initViews()方法仍然不变        initViews();       //初始化一个Presenter        mWifiPresenter = new WifiPresenterImpl(this);        //将需要初始化的东西交由Presenter处理        mWifiPresenter.onCreate();    }    private void initViews() {        mToolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(mToolbar);        mListView = (ListView) findViewById(R.id.listView);        mFAB = (FloatingActionButton) findViewById(R.id.fab);        mFAB.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {            //处理用户的事件                mWifiPresenter.showSnackbar(view);            }        });    }    //实现view接口的方法,为listview设置数据    @Override    public void setListViewData(ArrayList<WifiBean> list) {        mWifiAdapter = new WifiAdapter(this,list);        mListView.setAdapter(mWifiAdapter);    }    //实现view接口的方法,弹出Snackbar    @Override    public void showSnackbar(View view) {        Snackbar.make(view, "侧滑有惊喜哦!", Snackbar.LENGTH_LONG)                .setAction("Action", null).show();    }}

最后是Presenter ,用来处理Model和View

public interface IWifiPresenter {    //交付过来的onCreate    void onCreate();}public class WifiPresenterImpl implements IWifiPresenter{    private IWifiView mWifiView;    private IWifiModel mWifiModel;    public WifiPresenterImpl(IWifiView wifiView) {        //传入View        mWifiView = wifiView;        //初始化Model        mWifiModel = new WifiModelImpl();    }    //私有方法,在onCreate里调用,用来初始化listview数据,presenter操作model和view     private void setWifiDatas() {        mWifiView.setListViewData(mWifiModel.getWifis());    }    //交付过来的onCreate()周期    @Override    public void onCreate() {        setWifiDatas();    }    //让Snackbar显示    public void showSnackbar(View view) {        mWifiView.showSnackbar(view);    }}

好了,基本上简单的展示写完了,可以看到思路逻辑非常的清晰。这也是我对MVP模式的一点理解和应用,光是这一点内容,就理解了好久。。。。如果有什么错误的地方,求各位拍砖,一起讨论。

欢迎关注我的博客,蟹蟹!

参考文章:
http://blog.csdn.net/knxw0001/article/details/39637273
http://blog.csdn.net/duo2005duo/article/details/50594757
http://blog.csdn.net/lmj623565791/article/details/46596109

4 2
原创粉丝点击