MVC:
M表示数据,V表示UI,C用于协调Model和View之间的交互
实例代码
Model
public class UserModel {private String username;private String email;public UserModel(String username, String email) {this.username = username;this.email = email;}public String getUsername() {return username;}public String getEmail() {return email;}
}
View:
public class UserView {public void displayUserInfo(String username, String email) {System.out.println("User Info: " + username + ", " + email);}
}
Controller:
public class UserController {private UserModel model;private UserView view;public UserController(UserModel model, UserView view) {this.model = model;this.view = view;}public void updateView() {view.displayUserInfo(model.getUsername(), model.getEmail());}
}
MainActivity中:
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);UserModel userModel = new UserModel("JohnDoe", "john@example.com");UserView userView = new UserView();UserController userController = new UserController(userModel, userView);// Display user infouserController.updateView();}
}
MVP :用Presenter
替代了 Controller
,它充当了视图和模型之间的中介,负责业务逻辑。
Model:
public class UserModel {private String username;private String email;public UserModel(String username, String email) {this.username = username;this.email = email;}public String getUsername() {return username;}public String getEmail() {return email;}
}
View:
public interface UserView {void displayUserInfo(String username, String email);
}
Presenter:
public class UserPresenter {private UserModel model;private UserView view;public UserPresenter(UserModel model, UserView view) {this.model = model;this.view = view;}public void updateView() {view.displayUserInfo(model.getUsername(), model.getEmail());}
}
MainActivity:
public class MainActivity extends AppCompatActivity implements UserView {private UserPresenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);UserModel userModel = new UserModel("JohnDoe", "john@example.com");presenter = new UserPresenter(userModel, this);// Display user info via presenterpresenter.updateView();}@Overridepublic void displayUserInfo(String username, String email) {System.out.println("User Info: " + username + ", " + email);}
}
MVVM :ViewModel是负责从model获取数据并且将其准备好供View使用的类,View和View之间通过数据绑定进行交互
Model:
public class UserModel {private String username;private String email;public UserModel(String username, String email) {this.username = username;this.email = email;}public String getUsername() {return username;}public String getEmail() {return email;}
}
ViewModel:
public class UserViewModel extends ViewModel {private MutableLiveData<UserModel> userLiveData;public UserViewModel() {userLiveData = new MutableLiveData<>();}public LiveData<UserModel> getUserLiveData() {return userLiveData;}public void fetchUserData() {// Mock dataUserModel userModel = new UserModel("JohnDoe", "john@example.com");userLiveData.setValue(userModel);}
}
MainActivity:
public class MainActivity extends AppCompatActivity {private UserViewModel userViewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);userViewModel = new ViewModelProvider(this).get(UserViewModel.class);userViewModel.getUserLiveData().observe(this, userModel -> {// Update UI with user dataSystem.out.println("User Info: " + userModel.getUsername() + ", " + userModel.getEmail());});userViewModel.fetchUserData();}
}
关键区别:
-
MVC:
Controller
处理 UI 逻辑和业务逻辑,View
与Controller
紧密耦合。- 通常不适用于 Android,因为 Android 中的
Activity/Fragment
既是 View 又是 Controller,可能导致过多的职责。
-
MVP:
Presenter
负责所有的逻辑,而View
只负责显示内容。- 比较适合 Android,因为可以通过接口实现松耦合,测试也更容易。
-
MVVM:
- 使用
LiveData
和ViewModel
进行数据绑定,使得 UI 更新与数据的变化解耦。 - 非常适合使用 Jetpack 组件的 Android 应用,特别是当使用
DataBinding
时。
- 使用