MVC(Model-View-Controller)
1. 组件角色
- 模型(Model):
- 负责处理数据和业务逻辑,如数据的存储、检索、验证等。
- 视图(View):
- 负责展示数据给用户,通常是通过界面元素来呈现。
- 控制器(Controller):
- 作为模型和视图之间的桥梁,接收用户输入,处理请求,并调用模型和视图完成相应的操作。
2. 交互方式
- 视图通常可以直接访问模型来获取数据,但直接访问可能会增加视图和模型之间的耦合度。
- 控制器负责处理用户输入,并根据需要调用模型和视图。
3. 特点
- 强调关注点分离,即模型、视图和控制器各自承担不同的职责。
- 有助于提高应用程序的可维护性、可扩展性和可重用性。
- 视图直接访问模型可能导致较高的耦合度,增加测试和维护的难度。
具体业务场景示例
- 在线购物网站:
- 用户浏览商品列表(View)。
- 点击购买按钮(Controller)后,商品信息被发送到服务器(通过Model处理)。
- 更新购物车视图(View)。
- 博客系统:
- 用户通过表单(View)提交文章。
- 控制器(Controller)接收输入,调用模型(Model)处理数据(如验证、存储)。
- 成功后更新文章列表视图(View)。
MVP(Model-View-Presenter)
1. 组件角色
- 模型(Model):
- 负责处理数据和业务逻辑。
- 视图(View):
- 负责展示数据给用户,但不直接访问模型。
- 演示者(Presenter):
- 替代MVC中的控制器,负责处理视图和模型之间的交互。
2. 交互方式
- 视图和模型完全不通信,所有交互都通过Presenter进行。
- 视图将用户输入传递给Presenter,Presenter调用模型处理数据,并更新视图以显示结果。
3. 特点
- 通过Presenter层进一步降低视图和模型之间的耦合度,使依赖关系更松散。
- 提高应用程序的可测试性和可维护性,便于编写单元测试。
- 视图是被动角色,不主动从模型获取数据或更新显示,而是等待Presenter的指令。
具体业务场景示例
- 游戏应用:
- 复杂的用户交互和实时数据处理,Presenter使游戏逻辑独立于游戏界面进行开发和测试。
- 复杂表单应用:
- Presenter封装所有表单相关逻辑,视图只需展示数据和接收用户输入。
MVVM(Model-View-ViewModel)
组件角色
- 模型(Model):
- 处理数据逻辑。
- 视图(View):
- 负责显示数据,并能自动响应数据变化。
- ViewModel:
- 作为视图和模型之间的桥梁,实现双向数据绑定。
特点
- 双向数据绑定:
- 模型数据变化时视图自动更新,视图数据变化时模型也相应更新。
- 命令模式:
- 处理用户交互,将操作封装为命令对象并与ViewModel绑定。
- 高内聚低耦合:
- 视图和模型完全解耦,但双向数据绑定使交互更加紧密高效。
具体业务场景示例
- 实时数据监控应用:
- ViewModel从数据源获取数据并更新模型,视图通过数据绑定自动展示最新数据。
- 表单验证和编辑应用:
- ViewModel处理表单数据的验证和编辑逻辑,通过双向数据绑定自动同步更改到视图和模型。
- 移动端应用:
- 在Android和iOS开发中,结合数据绑定库(如LiveData、Data Binding)简化界面更新逻辑,提高开发效率和响应速度。
实现示例
1. MVC (Model-View-Controller)
应用场景:简单的应用,视图和控制器职责明确。
伪代码
// Model
class UserModel {
private String name;
// getters and setters
}
// View (interface)
interface UserView {
void updateName(String name);
}
// Controller
class UserController implements UserView.OnClickListener {
private UserModel model;
private UserView view;
UserController(UserModel model, UserView view) {
this.model = model;
this.view = view;
view.setOnClickListener(this);
}
@Override
public void onClick() {
// 处理用户点击事件,更新Model
model.setName("New Name");
// 通知View更新
view.updateName(model.getName());
}
}
2. MVP (Model-View-Presenter)
应用场景:复杂UI逻辑和大量业务逻辑的应用,需提高可测试性和可维护性。
伪代码
// Model
class UserModel {
// ... 同MVC
}
// View (interface)
interface UserView {
void setName(String name);
void showError(String message);
}
// Presenter
class UserPresenter {
private UserModel model;
private UserView view;
UserPresenter(UserModel model, UserView view) {
this.model = model;
this.view = view;
}
public void loadData() {
// 模拟数据加载
String name = model.getName(); // 可能来自网络请求
if (name != null) {
view.setName(name);
} else {
view.showError("Error loading data");
}
}
}
3. MVVM (Model-View-ViewModel)
应用场景:数据驱动的应用,如响应式UI,双向数据绑定等。
伪代码(注意:MVVM在Android中通常与数据绑定库如Data Binding或第三方库如LiveData, ViewModel等结合使用)
// Model
// ... 同MVC
// ViewModel
class UserViewModel extends ViewModel {
private MutableLiveData<String> name = new MutableLiveData<>();
public LiveData<String> getName() {
return name;
}
public void setName(String newName) {
name.setValue(newName);
}
// 假设有一个方法从数据源加载数据
public void loadData() {
// 模拟数据加载
String loadedName = "Loaded Name"; // 可能来自网络请求
setName(loadedName);
}
}
// View (Activity/Fragment)
// 在这里,View会观察ViewModel中的数据变化,并自动更新UI
// 伪代码省略了具体的观察和数据绑定代码