文章目录
【Java设计模式】模型 - 视图 - 展示器模式
一、概述
模型 - 视图 - 展示器(MVP)旨在将软件应用程序中的用户界面(UI)逻辑与业务逻辑和模型分离,以便更轻松地进行测试和维护。
二、详细解释及实际示例
- 实际示例:
- 考虑使用模型 - 视图 - 展示器(MVP)模式的现实世界类比,以餐厅场景为例:
- 模型:这是餐厅的厨房,所有菜肴的烹饪和准备都在这里进行。它负责管理食物原料、烹饪过程,并确保正确遵循食谱。
- 视图:这代表餐厅区域和呈现给顾客的菜单。它展示可用的菜肴,接受订单,并展示食物的最终呈现。然而,它不决定烹饪什么或如何准备。
- 展示器:作为服务员,展示器接受顾客的订单(输入)并将其传达给厨房(模型)。然后,服务员将准备好的食物(输出)带回餐厅区域的顾客(视图)。服务员确保顾客看到的(菜单和食物呈现)与厨房能够提供的相符,并根据厨房的能力更新视图(例如,缺货项目)。
- 在这个类比中,角色的明确分离使餐厅能够高效运营:厨房专注于食物准备,餐厅区域专注于顾客互动,服务员桥接两者,确保顺利运营和顾客满意度。
- 通俗解释:
- 模型 - 视图 - 展示器(MVP)模式在应用程序中分离用户界面、业务逻辑和数据交互,展示器在视图和模型之间进行中介,以促进清晰的通信和更新。Java开发人员使用MVP来改进应用程序结构。
- 维基百科解释:
- 模型 - 视图 - 展示器(MVP)是模型 - 视图 - 控制器(MVC)架构模式的衍生,主要用于构建用户界面。在MVP中,展示器承担“中间人”的功能。在MVP中,所有的表示逻辑都被推到展示器中。
三、Java中模型 - 视图 - 展示器模式的编程示例
模型 - 视图 - 展示器(MVP)设计模式是著名的模型 - 视图 - 控制器(MVC)模式的衍生。它旨在分离应用程序的逻辑(模型)、图形用户界面(视图)以及用户操作更新应用程序逻辑的方式(展示器)。这种关注点的分离使应用程序更易于管理、扩展和测试。
让我们使用提供的代码分解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。
权衡:
- 更多的类和接口增加了复杂性。
- 需要精心设计以避免展示器和视图之间的过度耦合。