android中mvc、mvp、mvvm模式区别

1. MVC 模式(Model-View-Controller)

代码结构:


// Model: 数据层
public class UserModel {
    private String name;
    public UserModel(String name) { this.name = name; }
    public String getName() { return name; }
}

// View: XML 布局 + Activity 的部分视图逻辑
// res/layout/activity_mvc.xml


// Controller: Activity 承担 Controller 角色
public class MvcActivity extends AppCompatActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvc);
        textView = findViewById(R.id.textView);

        // Controller 直接操作 Model 和 View
        UserModel model = new UserModel("MVC User");
        updateView(model);
    }

    private void updateView(UserModel model) {
        textView.setText(model.getName()); // 直接更新 View
    }
}
MVC 特点:
  • Activity 同时承担 View 和 Controller 角色,容易导致代码臃肿。

  • Model 和 View 直接耦合,难以单元测试。


2. MVP 模式(Model-View-Presenter)

代码结构:
// Model: 数据层
public class UserModel {
    private String name;
    public UserModel(String name) { this.name = name; }
    public String getName() { return name; }
}

// View 接口:解耦 View 逻辑
public interface UserView {
    void showUserName(String name);
}

// Presenter: 业务逻辑处理
public class UserPresenter {
    private UserView view;

    public UserPresenter(UserView view) {
        this.view = view;
    }

    public void loadUser() {
        UserModel model = new UserModel("MVP User");
        view.showUserName(model.getName()); // 通过接口更新 View
    }
}

// View 实现:Activity 只负责 UI
public class MvpActivity extends AppCompatActivity implements UserView {
    private TextView textView;
    private UserPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvp);
        textView = findViewById(R.id.textView);

        presenter = new UserPresenter(this);
        presenter.loadUser(); // 触发业务逻辑
    }

    @Override
    public void showUserName(String name) {
        textView.setText(name); // 实现 View 接口方法
    }
}
MVP 特点:
  • 通过接口解耦 View 和 Presenter,便于单元测试。

  • Presenter 不持有 Android 上下文,避免内存泄漏。


3. MVVM 模式(Model-View-ViewModel)

代码结构(使用 Jetpack 组件):
// Model: 数据层
public class UserModel {
    private String name;
    public UserModel(String name) { this.name = name; }
    public String getName() { return name; }
}

// ViewModel: 管理数据暴露
public class UserViewModel extends ViewModel {
    private MutableLiveData userName = new MutableLiveData<>();

    public LiveData getUserName() {
        return userName;
    }

    public void loadUser() {
        UserModel model = new UserModel("MVVM User");
        userName.setValue(model.getName()); // 更新 LiveData
    }
}

// View: Activity/Fragment 观察数据
public class MvvmActivity extends AppCompatActivity {
    private TextView textView;
    private UserViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvvm);
        textView = findViewById(R.id.textView);

        viewModel = new ViewModelProvider(this).get(UserViewModel.class);
        viewModel.getUserName().observe(this, name -> {
            textView.setText(name); // 自动响应数据变化
        });

        viewModel.loadUser(); // 触发数据加载
    }
}
MVVM 特点:
  • 数据驱动 UI(通过 LiveData/DataBinding,实现自动更新。

  • 减少手动更新 View 的代码,适合复杂 UI 交互。


关键区别总结:

特性 MVC MVP MVVM
职责分离 Activity 兼任 Controller Presenter 处理业务逻辑 ViewModel 管理数据状态
耦合度 高(View 和 Model 直接交互) 低(通过接口解耦) 低(数据绑定)
测试便利性 难以测试 便于单元测试 便于单元测试
代码量 较少(但易臃肿) 较多(需定义接口) 中等(利用 Jetpack)
适用场景 简单页面 需要测试的中型项目 复杂 UI 或数据驱动项目

补充说明:

  • MVC 在 Android 中通常表现为 Activity/Fragment 同时承担 View 和 Controller 角色。

  • MVP 通过接口隔离,使得 Presenter 可以脱离 Android 环境测试。

  • MVVM 结合 LiveData 和 DataBinding 实现声明式 UI,是 Google 官方推荐模式。

你可能感兴趣的:(android系统开发知识,android)