前言

为什么要使用架构模式,有什么作用?
使用架构的目的是使程序模块化,做到模块内部的高聚合和模块之间的低耦合,降低各层之间的耦合性,达到解耦的目的,减少模块代码之间的相互影响,模块区域的分明,也更加方便开发人员的维护


一、MVC是什么?

MVC是Model(模型层)-View(视图层)-Controller(控制器曾)的简称

Android中的MVC android mvc mvp_架构

Android中的MVC

Model:实体类,负责处理数据的加载或者存储
View: 布局文件,负责界面数据的展示,与用户进行交互
Controller:Activity,负责逻辑业务的处理

MVC的缺点是什么?

在Android中activity可以说同时充当V层和C层,这就是的activity的负担会比较重,随着页面以及业务逻辑复杂度的不断提升,Acitivity的代码就会变得臃肿,不利于后期的维护。

二、MVP是什么?

为了解决MVC的问题,MVP就被提出来了

MVP 是Model(模型)-View(视图)-Presenter(主持人 可以理解为中介)

在MVP中M层和V层是没有直接联系的,通过P层来完成它们之间的交流

Android中的MVC android mvc mvp_架构_02

Android中的MVP

Model:实体类(负责处理数据的加载或者存储,处理逻辑业务逻辑)。

View:布局文件+Activity,负责界面数据的展示,与用户进行交互。

Presenter:中介,负责完成View与Model间的交互。

三、实例

MVC实例

实现一个用户登录的功能

文件结构

Android中的MVC android mvc mvp_架构_03

1.布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".LogonActivity">
    
    <EditText
        android:id="@+id/et_logon_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <EditText
        android:id="@+id/et_logon_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:layout_gravity="center"
        android:id="@+id/bt_logon"
        android:text="登录"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

2.实体类

public class User {
    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3.Activity

public class LogonActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logon);
        EditText username = findViewById(R.id.et_logon_username);
        EditText password = findViewById(R.id.et_logon_password);
        Button button = findViewById(R.id.bt_logon);
        //设置user数据
        User user = new User("张三","123456");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //验证用户名和密码是否正确
                if (user.getUsername().equals(username)&&user.getPassword().equals(password)){
                    Toast.makeText(LogonActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(LogonActivity.this,"登陆失败",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

MVP实例

实现一个用户登录的功能

文件结构

Android中的MVC android mvc mvp_mvc_04

1.Model层

User实体类与MVC实体类一样

UserLogon 实现类

public class UserLogon implements UserLogonInterface {
    @Override
    public void logon(String username, String password,UserLogonListener userLogonListener) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        if (username.equals("张三")&&password.equals("123456")){
            userLogonListener.logonSuccess(user);
        }else {
            userLogonListener.logonFailed(user);
        }
    }
}

UserLogonInterface 接口

public interface UserLogonInterface {
    void logon(String username, String password,UserLogonListener userLogonListener);
}

UserLogonListener 监听

public interface UserLogonListener {
    void logonSuccess(User user);
    void logonFailed(User user);
}

2.View层

布局
布局跟MVC布局一样,就不重复贴代码了。

LogonActivity 类

public class LogonActivity extends AppCompatActivity implements UserLogonViewInterface{
private EditText username;
private EditText password;
private Button button;
private UserLogonPresenter userLogonPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_logon);
        //初始化控件
        username = findViewById(R.id.et_username);
        password = findViewById(R.id.et_password);
        button = findViewById(R.id.bt_logon);
        userLogonPresenter = new UserLogonPresenter(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                userLogonPresenter.logon();
            }
        });
    }

    @Override
    public String getUsername() {
        return username.getText().toString();
    }

    @Override
    public String getPassword() {
        return password.getText().toString();
    }

    @Override
    public void onSuccess(User user) {
        Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailed(User user) {
        Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
    }
}

UserLogonViewInterface 类

public interface UserLogonViewInterface {
    String getUsername();
    String getPassword();
    void onSuccess(User user);
    void onFailed(User user);
}

3.Presenter层

UserLogonPresenter 类

public class UserLogonPresenter {
    private UserLogonViewInterface userLogonViewInterface;
    private UserLogonInterface userLogonInterface;

    public UserLogonPresenter(UserLogonViewInterface userLogonViewInterface) {
        this.userLogonViewInterface = userLogonViewInterface;
        userLogonInterface = new UserLogon();
    }

    public void logon() {
        userLogonInterface.logon(userLogonViewInterface.getUsername(), userLogonViewInterface.getPassword(), new UserLogonListener() {
            @Override
            public void logonSuccess(User user) {
                userLogonViewInterface.onSuccess(user);
            }

            @Override
            public void logonFailed(User user) {
                userLogonViewInterface.onFailed(user);
            }
        });

    }
}

MVP实例执行流程:
用户点击按钮触发监听,调用UserLogonPresenter类的logon方法,然后会调用UserLogon类中的logon方法,然后判断用户信息是否正确,回调UserLogonPresenter类的logonSuccess或者logonFailed方法,然后再次回调LogonActivity类的onSuccess或者onFailed方法,最后提示用户登陆成功还是失败