以天气预报APP为例理解MVC MVP 和 MVVM
CodeGPT的回答
在Android Studio中打开CodeGPT,并问他 :天气预报APP用MVC、MVP和MVVM分别怎么写?
MVC
// Model(模型)
public class WeatherModel {
private String weatherData;
public void setWeatherData(String data) {
this.weatherData = data;
}
public String getWeatherData() {
return weatherData;
}
}
// View(视图)
public class WeatherView {
public void displayWeather(String weatherData) {
System.out.println("当前天气:" + weatherData);
}
}
// Controller(控制器)
public class WeatherController {
private WeatherModel model;
private WeatherView view;
public WeatherController(WeatherModel model, WeatherView view) {
this.model = model;
this.view = view;
}
public void updateWeather(String data) {
model.setWeatherData(data);
view.displayWeather(model.getWeatherData());
}
}
在MVC中,控制器(Controller)负责处理用户的输入并更新模型(Model)和视图(View),控制器(Controller)直接与视图(View)交互
MVP
// Model(模型)
public class WeatherModel {
private String weatherData;
public void setWeatherData(String data) {
this.weatherData = data;
}
public String getWeatherData() {
return weatherData;
}
}
// View(视图)
public interface WeatherView {
void displayWeather(String weatherData);
}
// Presenter(主持人)
public class WeatherPresenter {
private WeatherModel model;
private WeatherView view;
public WeatherPresenter(WeatherModel model, WeatherView view) {
this.model = model;
this.view = view;
}
public void updateWeather(String data) {
model.setWeatherData(data);
view.displayWeather(model.getWeatherData());
}
}
在MVP中,主持人(Presenter)负责处理用户的输入并更新模型(Model)和视图(View)。与MVC不同的是,主持人(Presenter)通过接口与视图(View)交互,实现了视图(View)和模型(Model)的解耦。
- 我继续追问GPT : 怎么理解 “MVP中主持人通过接口与视图交互,实现了视图和模型的解耦”
在MVP架构中,主持人(Presenter)通过接口与视图(View)进行交互。这意味着视图和主持人之间的通信是通过定义好的接口进行的,而不是直接引用具体的视图实例。这种通过接口进行交互的方式实现了视图和模型(Model)的解耦。
通过使用接口,视图和主持人之间的依赖关系被抽象化,视图只需要知道主持人提供的接口方法,并不需要关心具体的主持人实现。同样地,主持人也只需要关注视图提供的接口方法,而不需要了解具体的视图实现细节。
这种解耦的好处是,当需要更改或替换视图或主持人时,只需实现相同的接口即可,而不会影响其他部分的代码。例如,如果需要更换视图的实现,只需编写一个新的视图类并实现相同的接口,然后将其传递给主持人即可,而不需要修改主持人的代码。
通过接口进行交互还可以提高代码的可测试性,因为可以轻松地使用模拟对象来替代真实的视图或主持人,以进行单元测试。
因此,MVP中主持人通过接口与视图交互,实现了视图和模型的解耦,使得视图和模型可以独立开发、测试和修改,提高了代码的可维护性和可扩展性。
MVVM
// Model(模型)
public class WeatherModel {
private String weatherData;
public void setWeatherData(String data) {
this.weatherData = data;
}
public String getWeatherData() {
return weatherData;
}
}
// View(视图)
public class WeatherView {
private WeatherViewModel viewModel;
public void setViewModel(WeatherViewModel viewModel) {
// 个人理解 : 通过这里与ViewModel绑定
this.viewModel = viewModel;
}
public void displayWeather(String weatherData) {
System.out.println("当前天气:" + weatherData);
}
public void onCitySelected(String city) {
viewModel.updateWeather(city);
}
}
// ViewModel(视图模型)
public class WeatherViewModel {
private WeatherModel model;
private WeatherView view;
public WeatherViewModel(WeatherModel model, WeatherView view) {
this.model = model;
this.view = view;
}
public void updateWeather(String city) {
// 模拟获取天气数据的操作
String weatherData = fetchWeatherData(city);
model.setWeatherData(weatherData);
view.displayWeather(model.getWeatherData());
}
private String fetchWeatherData(String city) {
// 模拟获取天气数据的逻辑
return "天气数据";
}
}
在MVVM中,视图(View)通过绑定到视图模型(ViewModel)来展示数据,并将用户的输入事件传递给视图模型(ViewModel)进行处理。视图模型(ViewModel)负责从模型(Model)中获取数据,并将处理后的数据提供给视图(View)进行展示。视图(View)和视图模型(ViewModel)之间通过双向绑定进行通信,当视图(View)的状态发生变化时,视图模型(ViewModel)会自动更新数据。
以上示例中,视图(View)通过调用视图模型(ViewModel)的方法来更新天气数据,并通过绑定显示视图模型(ViewModel)提供的数据。视图模型(ViewModel)负责从模型(Model)中获取天气数据,并将其提供给视图(View)进行展示。
根据CodeGPT的回答抽象出模型
以CodeGPT的回答为例,抽象出MVC、MVP与MVVM对应的模型,并以图片的形式直观展示
其中,图中的实线为具体的方法,虚线为数据传输线
MVC
MVP
MVVM
如有错误,欢迎指正~