Java 中的模型-视图-表示器模式:增强 UI 逻辑分离以获得更简洁的代码
也称为
- MVP
模型-视图-表示器设计模式的意图
MVP 旨在将用户界面 (UI) 逻辑与软件应用程序中的业务逻辑和模型分离,从而简化测试和维护。
模型-视图-表示器模式的详细说明,包括现实世界示例
现实世界示例
考虑使用餐厅场景模拟模型-视图-表示器 (MVP) 模式
模型:这是餐厅的厨房,所有烹饪和菜肴准备都在这里进行。它负责管理食材、烹饪过程并确保正确遵循食谱。
视图:这代表餐厅的用餐区和向顾客展示的菜单。它显示可用的菜肴、接受订单并展示食物的最终呈现方式。但它不会决定烹饪什么或如何烹饪。
表示器:表示器充当服务员的角色,接受顾客的订单(输入)并将其传达给厨房(模型)。服务员然后将准备好的食物(输出)带回用餐区(视图)的顾客。服务员确保顾客看到的内容(菜单和食物的呈现方式)与厨房能够提供的服务一致,并且根据厨房的功能(例如,缺货商品)更新视图。
在这个类比中,角色的明确分离使餐厅能够高效地运营:厨房专注于食物准备,用餐区专注于顾客互动,服务员连接两者,确保运营顺畅和顾客满意。
通俗易懂
模型-视图-表示器 (MVP) 模式将应用程序中的用户界面、业务逻辑和数据交互分开,表示器在视图和模型之间进行协调,以促进清晰的通信和更新。Java 开发人员使用 MVP 来改进应用程序结构。
维基百科说
模型-视图-表示器 (MVP) 是模型-视图-控制器 (MVC) 架构模式的衍生,主要用于构建用户界面。在 MVP 中,表示器承担“中间人”的功能。在 MVP 中,所有呈现逻辑都推送到表示器中。
Java 中模型-视图-表示器模式的编程示例
模型-视图-表示器 (MVP) 设计模式是众所周知的模型-视图-控制器 (MVC) 模式的衍生。它旨在将应用程序的逻辑(模型)、GUI(视图)以及用户操作更新应用程序逻辑的方式(表示器)分开。这种关注点分离使应用程序更易于管理、扩展和测试。
让我们使用提供的代码分解 MVP 模式
- 模型:模型代表应用程序的逻辑。在我们的案例中,
FileLoader
类是模型。它负责处理文件加载过程。
@Getter
public class FileLoader implements Serializable {
//...
public void setFileName(String fileName) {
this.fileName = fileName;
}
public boolean fileExists() {
//...
}
public String loadData() {
//...
}
}
- 视图:视图负责显示模型提供的数据。这里,
FileSelectorView
接口及其实现FileSelectorJFrame
代表视图。它们定义了如何向用户显示数据和消息。
public interface FileSelectorView {
//...
void setPresenter(FileSelectorPresenter presenter);
void open();
void close();
void showMessage(String message);
void displayData(String data);
String getFileName();
}
public class FileSelectorJFrame implements FileSelectorView {
//...
@Override
public void displayData(String data) {
this.dataDisplayed = true;
}
}
- 表示器:表示器充当模型和视图之间的桥梁。它对用户的操作做出反应并相应地更新视图。在我们的示例中,
FileSelectorPresenter
类是表示器。
public class FileSelectorPresenter implements Serializable {
//...
public void setLoader(FileLoader loader) {
this.loader = loader;
}
public void start() {
view.setPresenter(this);
view.open();
}
public void fileNameChanged() {
loader.setFileName(view.getFileName());
}
public void confirmed() {
//...
}
public void cancelled() {
view.close();
}
}
最后,我们在 App
类中连接表示器、视图和模型
public class App {
public static void main(String[] args) {
var loader = new FileLoader();
var frame = new FileSelectorJFrame();
var presenter = new FileSelectorPresenter(frame);
presenter.setLoader(loader);
presenter.start();
}
}
在此设置中,App
类创建模型、视图和表示器的实例。然后它连接这些实例,形成 MVP 三元组。表示器被赋予对视图的引用,模型被设置为表示器。最后,表示器启动,它反过来打开视图。
何时在 Java 中使用模型-视图-表示器模式
在需要在演示层和底层业务逻辑之间进行明确关注点分离的应用程序中使用 MVP。它在客户端-服务器应用程序和企业级应用程序中特别有用。
Java 中模型-视图-表示器模式的现实世界应用
- 使用 Java Swing 或 JavaFX 构建的桌面应用程序。
- 具有复杂用户界面和业务逻辑的 Web 应用程序。
模型-视图-表示器模式的优缺点
优点
- 通过允许表示器与视图分开进行测试,增强了 UI 逻辑的可测试性。
- 促进了关注点分离,使应用程序更易于管理和扩展。
- 便于更容易的 UI 更新,而不会影响业务逻辑。
权衡
- 由于增加了更多的类和接口,因此复杂性增加。
- 需要仔细设计,以避免表示器与视图之间过度耦合。
相关的 Java 设计模式
- 模型-视图-控制器 (MVC):MVP 通常被认为是 MVC 的一种变体,其中表示器接管了控制器在管理用户输入和更新模型中的角色。
- 模型-视图-视图模型 (MVVM):类似于 MVP,但适应于 WPF 等框架或支持数据绑定的框架,使视图在模型更改时自动更新。