zoukankan      html  css  js  c++  java
  • Android开发之初识MVP模式

    这里写图片描述
    各位亲爱的小伙伴,有没有想我啊,我胡汉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

  • 相关阅读:
    Linux常用命令大全
    Shell常用命令整理
    登录织梦后台提示用户名不存在的解决方法介绍
    dedecms系统后台登陆提示用户名密码不存在
    dede被注入后台提示用户名不存在解决方法
    织梦dedecmsV5.7联动类型无法显示的处理方法
    漏洞安全防范
    Sublime 安装、插件CoolFormat
    如何查看sublime安装了哪些插件
    本地如何使用phpstudy环境搭建多站点
  • 原文地址:https://www.cnblogs.com/muyuge/p/6333526.html
Copyright © 2011-2022 走看看