MVC模式将代码分为三个部分:模型、视图、控制器。其中,模型定义数据以及对数据的操作接口。视图用于展示模型中的数据给用户,同时相应用户的操作,将用户的操作传递给控制器,控制器根据用户的操作执行相应的业务逻辑,访问或修改模型数据,同时控制器可以根据操作更新视图。另外,数据模型的更新可以通过观察者模式通知视图或者控制器。典型的MVC模式如下图,它们之间的交互通过方法调用或者事件模型来完成:
在Apple公司的Cocoa框架中,模型不直接与视图进行交互,它们之间的交互都通过控制器来传递,因而实现模型和控制器的解耦。此时,控制器同时监听数据模型和视图界面,根据它们的变化实现相应的逻辑控制。即:控制器可以访问和操作数据模型,模型的数据更新会通知控制器。视图的用户交互也会通知控制器,控制器可以更新视图或者响应用户操作。
下面是一个简单计算的例子,用户界面如下图:
这个简单界面实现连续乘法,在Input输入一个数,第一次输入时,点击Multiply按钮将这个数与1相乘,结果显示在Total中,第二次以后的输入,将Input中的数和Total中的数相乘。Clear按钮可以将Total恢复到初始值1.如果输入的数不是整数,弹出对话框提示用户。
在这个例子中,我们用到了上面描述的MVC之间的各种交互,先给出代码,首先是模型类:
/**
* @author Brandon B. Lin
*
*/
public class CalcModel extends Observable {
private static final String INITIAL_VALUE = "1";
private BigInteger total;
CalcModel() {
reset();
}
public void reset() {
total = new BigInteger(INITIAL_VALUE);
setChanged();
notifyObservers();
}
public void multiplyBy(String operand) {
total = total.multiply(new BigInteger(operand));
setChanged();
notifyObservers();
}
public void setTotal(String newValue) {
total = new BigInteger(newValue);
setChanged();
notifyObservers();
}
public String getTotal() {
return total.toString();
}
这个模型继承了抽象类Observable,如果Total的值发生变化,会通知实现注册的观察者,即下面的视图类:
/**
* @author Brandon B. Lin
*
*/
class CalcView extends JFrame implements Observer {
private static final long serialVersionUID = 5000467452832579495L;
private static final String INITIAL_VALUE = "1";
private JTextField userInputTextField = new JTextField(5);
private JTextField totalTextField = new JTextField(20);
private JButton multiplyButton = new JButton("Multiply");
private JButton clearButton = new JButton("Clear");
private CalcModel model;
CalcView(CalcModel model) {
this.model = model;
this.model.addObserver(this);
this.model.setTotal(INITIAL_VALUE);
totalTextField.setText(model.getTotal());
totalTextField.setEditable(false);
init();
}
private void init() {
JPanel content = new JPanel();
content.setLayout(new FlowLayout());
content.add(new JLabel("Input"));
content.add(userInputTextField);
content.add(multiplyButton);
content.add(new JLabel("Total"));
content.add(totalTextField);
content.add(clearButton);
this.setContentPane(content);
this.pack();
this.setTitle("Simple Calc - MVC");
// The window closing event should probably be passed to the
// Controller in a real program, but this is a short example.
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void reset() {
totalTextField.setText(INITIAL_VALUE);
}
String getUserInput() {
return userInputTextField.getText();
}
void setTotal(String newTotal) {
totalTextField.setText(newTotal);
}
void showError(String errMessage) {
JOptionPane.showMessageDialog(this, errMessage);
}
void addMultiplyListener(ActionListener mal) {
multiplyButton.addActionListener(mal);
}
void addClearListener(ActionListener cal) {
clearButton.addActionListener(cal);
}
@Override
public void update(Observable arg0, Object arg1) {
setTotal(model.getTotal());
}
视图类实现观察者接口Observer,初始化图像界面,响应用户操作,同时提供了注册监听器的两个接口。视图持有模型的引用,在模型变化的时候使用模型的数据来更新界面。当用户与视图交互时,作为响应,视图通知实现注册的监听器,用户操作与监听器之间的逻辑关系在控制器类中绑定。
/**
* @author Brandon B. Lin
*
*/
public class CalcController {
private CalcModel model;
private CalcView view;
CalcController(CalcModel model, CalcView view) {
this.model = model;
this.view = view;
view.addMultiplyListener(new MultiplyListener());
view.addClearListener(new ClearListener());
}
class MultiplyListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String userInput = "";
try {
userInput = view.getUserInput();
model.multiplyBy(userInput);
} catch (NumberFormatException nfex) {
view.showError("Bad input: '" + userInput + "'");
}
}
}
class ClearListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
model.reset();
}
}
}
控制器持有视图和模型的引用,在这个类中,定义了用户操作与监听器之间的逻辑关系,也就是说,对于用户的某个操作,程序该如何响应(调用哪个监听器中的方法)在这个类中定义。另外,控制器可以访问模型,更新视图或者响应用户,例如上面的方法调用:view.showError()。
下面是一个测试类,即实例化各个对象:
public class CalcMVC {
public static void main(String[] args) {
CalcModel model = new CalcModel();
CalcView view = new CalcView(model);
new CalcController(model, view);
view.setVisible(true);
}
}
在上面的实现中,MVC三者之间的关系较为复杂,它们之间的耦合也比较紧密。可以采用事件模型来解耦模型和视图,它们之间只通过中介控制器来通信。
分享到:
相关推荐
【ContactManagerMVC2】是一个由外籍开发者编写的MVC(Model-View-Controller)模式的应用实例,专门用于展示和学习MVC设计模式在实际项目中的应用。MVC是一种广泛应用于Web开发的软件架构模式,它将应用程序分为三...
libgitlmvc 是一个基于Qt构建的的C++ MVC 框架 概览: View<====>Front Controller<====>Commands<====>Model 该框架包括四个部分: 视图: 用户交互界面 前端控制其(Front Controller): 处理所有的视图请求 ...
本文将详细介绍如何使用Qt5实现一个MVC的例子,以及涉及的相关知识点。 首先,我们来理解MVC模式的基本概念: 1. Model(模型):负责处理数据和业务逻辑,它是应用程序的核心部分。在Qt中,我们可以使用...
PureMVC是一个轻量级的、跨平台的MVC(模型-视图-控制器)框架,主要用于构建可维护性和可扩展性高的应用。这个“PureMVC简单例子”是为了帮助初学者理解PureMVC框架的基本原理和实际操作流程。在这个例子中,我们将...
总的来说,这个"MVC例子"是一个典型的Web开发应用场景,展示了如何使用jsp、MVC架构和MySQL数据库来创建一个小型的数据库访问系统。通过这样的实践,开发者可以更好地理解MVC模式的原理和工作流程,为更复杂的项目...
总结来说,"MVC设计模式例子程序"是一个演示了如何在C#的Windows Forms环境下实现MVC模式的应用。通过模型、视图和控制器的分离,这个程序实现了业务逻辑、用户界面和数据管理的清晰划分,增强了代码的可读性和可...
在这个简单的Mvc例子中,我们可以探讨每个组成部分的作用。 1. **模型(Model)**:模型是应用的核心,它处理业务逻辑和数据管理。在Java Web开发中,模型通常由JavaBeans或POJO(Plain Old Java Objects)类构成,...
总结来说,这个"PureMVC登录例子"展示了如何利用PureMVC框架来构建一个简单的登录功能。通过Proxy处理数据,Mediator协调视图和用户交互,Command执行业务逻辑,整个流程高效且模块化。对于初学者而言,这是一个很好...
总结来说,这个简单的MVC框架例子展示了如何使用JavaBean、Servlet和JSP来构建一个基本的Web应用。这种架构有助于分离关注点,使代码更易于维护和扩展。在实际项目中,更复杂的MVC框架,如Spring MVC,会提供更丰富...
2. **定义模型**:创建一个名为`Mvc.Models`的命名空间,定义一个简单的类,如`Person`,包含一些属性。 3. **创建控制器**:在Controllers文件夹中,添加一个新的控制器,如`PersonController`,并添加一个操作方法...
在“spring MVC myeclipse例子”中,我们通常会经历以下几个关键步骤来创建一个简单的Spring MVC项目: 1. **项目初始化**:首先,我们需要在MyEclipse中创建一个新的Dynamic Web Project,然后通过Spring工具集或...
标题中的“PureMVC的例子”指的是一个使用PureMVC框架的示例项目,这是一款轻量级的、基于观察者模式的多层架构设计模式框架,适用于ActionScript 3.0、Flex、Java、Swift等多种编程语言。PureMVC旨在简化开发流程,...
在这个“雅虎天气PureMVC例子”中,我们将探讨如何利用PureMVC框架实现一个简单的天气查询应用。 PureMVC是基于观察者模式(Observer Pattern)、命令模式(Command Pattern)和门面模式(Facade Pattern)的框架。...
"flex3"则表示这些例子和文档可能是针对Flex 3版本的,这是Adobe Flex SDK的一个早期版本,但其核心概念和MVC原则在后续版本中仍然适用。 在压缩包文件名称列表中提到的"pureMVC"很可能是包含所有PureMVC示例项目和...
总结来说,"android使用mvc小例子"是一个很好的实践教程,它演示了如何在Android应用中应用MVC模式,帮助开发者理解如何将业务逻辑、用户界面和数据处理有效地分离开来。通过这个实例,初学者可以深入学习Android...
这是一个MVC例子,简单的接受了MVC的实现过程。
例如,`eCrossDemoUI`可能是一个使用MVC架构的Web应用示例,其中包含了前端界面、后端逻辑和交互控制。 **开发实践**: 1. **路由**:控制器通常通过URL路由来接收和处理请求。 2. **模板引擎**:视图通常使用模板...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,专为构建 MVC(Model-View-Controller)架构的应用程序而设计。MVC 模式是一种将业务逻辑、数据和用户界面分离的设计模式,使得开发...
**描述:“一个用JSF+Servlet+DAO实现的一个小的登入系统,体现了MVC架构思想,存档以备后用。”** 在这个项目中,我们主要探讨的是MVC(Model-View-Controller)架构模式在Web开发中的应用。MVC是一种设计模式,它...
在这个"Spring MVC 简单小例子"中,我们将深入探讨如何利用它实现一个基础的"Hello, World!"程序,同时涵盖自定义Filter和ServletResponse的使用。 首先,让我们从Spring MVC的基本结构开始。一个典型的Spring MVC...