Android-MVVM架构模式

图片来源于网络

前面说了MVC和MVP架构模式,那下面就来聊聊MVVM架构模式,这个架构模式我之前也是没有用过,身边也很少朋友用到这个架构模式,既然它存在我们就要了解他。

MVVM详解

MVVM是Model-View-ViewModel的简写。

  • Model代表基本的业务逻辑;
  • View显示内容,用户界面;
  • ViewModel将Model和View两者联系在一起。


    在这里插入图片描述

MVVM的优点

  1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
  4. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

MVVM实现登录小案例

1.分包结构

在这里插入图片描述

2.配置Model的build.gradle文件

android{
    dataBinding{
        enabled = true
    }
}

3.xml文件



    
    
        
    
    

        

        

        

4.Model层

主要是Bean数据类,小案例使用硬编码的形式,所以没有用到。

public class User {
    /**
     * 用户名
     */
    private String name;
    /**
     * 密码
     */
    private String pwd;

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

5.view层

用户界面,主要用来放Activity、Fragment、Dialog。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        MainViewModel mainViewModel = new MainViewModel(this);
        binding.setViewModel(mainViewModel);
    }
}

6.ViewModel层

主要用于View和Model之间的联系,业务逻辑处理。

public class MainViewModel {

    /**
     * 用户名
     */
    private String userName;
    /**
     * 密码
     */
    private String pwd;
    /**
     * 上下文
     */
    private Context mContext;

    public MainViewModel(Context mContext) {
        this.mContext = mContext;
    }

    /**
     * 获取用户输入的用户名方法
     */
    public TextWatcher userNameChangeListener() {
        return new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                userName = s.toString();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        };
    }

    /**
     * 获取用户输入的密码方法
     */
    public TextWatcher pwdChangeListener() {
        return new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                pwd = s.toString();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        };
    }

    /**
     * 登录的方法
     *
     * @param view 绑定登录事件的视图
     */
    public void login(View view) {
        if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(pwd)) {
            // 模拟数据判断
            if (userName.equals("zhangsan") && pwd.equals("123456")) {
                Toast.makeText(mContext, "登录成功!!!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(mContext, "登录失败!!!", Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(mContext, "用户名和密码都不能为空哦", Toast.LENGTH_SHORT).show();
        }
    }
}

上面内容是我对MVVM架构模式的一些理解,通过MVVM来实现登录小案例,希望对想要了解MVP的小伙伴们有帮助。

你可能感兴趣的:(Android-MVVM架构模式)