`
0428loveyu
  • 浏览: 30767 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

一个MVC例子

 
阅读更多

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三者之间的关系较为复杂,它们之间的耦合也比较紧密。可以采用事件模型来解耦模型和视图,它们之间只通过中介控制器来通信。




分享到:
评论

相关推荐

    老外写的一个MVC例子,ContactManagerMVC2,强烈推荐

    【ContactManagerMVC2】是一个由外籍开发者编写的MVC(Model-View-Controller)模式的应用实例,专门用于展示和学习MVC设计模式在实际项目中的应用。MVC是一种广泛应用于Web开发的软件架构模式,它将应用程序分为三...

    Qt5实现的一个mvc的例子

    libgitlmvc 是一个基于Qt构建的的C++ MVC 框架 概览: View<====>Front Controller<====>Commands<====>Model 该框架包括四个部分: 视图: 用户交互界面 前端控制其(Front Controller): 处理所有的视图请求 ...

    Qt5实现的一个mvc 的例子

    本文将详细介绍如何使用Qt5实现一个MVC的例子,以及涉及的相关知识点。 首先,我们来理解MVC模式的基本概念: 1. Model(模型):负责处理数据和业务逻辑,它是应用程序的核心部分。在Qt中,我们可以使用...

    PureMVC简单例子

    PureMVC是一个轻量级的、跨平台的MVC(模型-视图-控制器)框架,主要用于构建可维护性和可扩展性高的应用。这个“PureMVC简单例子”是为了帮助初学者理解PureMVC框架的基本原理和实际操作流程。在这个例子中,我们将...

    MVC例子

    总的来说,这个"MVC例子"是一个典型的Web开发应用场景,展示了如何使用jsp、MVC架构和MySQL数据库来创建一个小型的数据库访问系统。通过这样的实践,开发者可以更好地理解MVC模式的原理和工作流程,为更复杂的项目...

    MVC设计模式例子程序

    总结来说,"MVC设计模式例子程序"是一个演示了如何在C#的Windows Forms环境下实现MVC模式的应用。通过模型、视图和控制器的分离,这个程序实现了业务逻辑、用户界面和数据管理的清晰划分,增强了代码的可读性和可...

    一个简单的mvc例子

    在这个简单的Mvc例子中,我们可以探讨每个组成部分的作用。 1. **模型(Model)**:模型是应用的核心,它处理业务逻辑和数据管理。在Java Web开发中,模型通常由JavaBeans或POJO(Plain Old Java Objects)类构成,...

    PureMVC登陆例子

    总结来说,这个"PureMVC登录例子"展示了如何利用PureMVC框架来构建一个简单的登录功能。通过Proxy处理数据,Mediator协调视图和用户交互,Command执行业务逻辑,整个流程高效且模块化。对于初学者而言,这是一个很好...

    简单的MVC框架例子

    总结来说,这个简单的MVC框架例子展示了如何使用JavaBean、Servlet和JSP来构建一个基本的Web应用。这种架构有助于分离关注点,使代码更易于维护和扩展。在实际项目中,更复杂的MVC框架,如Spring MVC,会提供更丰富...

    MVC简单例子C#

    2. **定义模型**:创建一个名为`Mvc.Models`的命名空间,定义一个简单的类,如`Person`,包含一些属性。 3. **创建控制器**:在Controllers文件夹中,添加一个新的控制器,如`PersonController`,并添加一个操作方法...

    spring MVC myeclipse例子

    在“spring MVC myeclipse例子”中,我们通常会经历以下几个关键步骤来创建一个简单的Spring MVC项目: 1. **项目初始化**:首先,我们需要在MyEclipse中创建一个新的Dynamic Web Project,然后通过Spring工具集或...

    PureMVC的例子

    标题中的“PureMVC的例子”指的是一个使用PureMVC框架的示例项目,这是一款轻量级的、基于观察者模式的多层架构设计模式框架,适用于ActionScript 3.0、Flex、Java、Swift等多种编程语言。PureMVC旨在简化开发流程,...

    雅虎天气puremvc例子 (改至网络)

    在这个“雅虎天气PureMVC例子”中,我们将探讨如何利用PureMVC框架实现一个简单的天气查询应用。 PureMVC是基于观察者模式(Observer Pattern)、命令模式(Command Pattern)和门面模式(Facade Pattern)的框架。...

    PureMVC 各种例子以及中文文档

    "flex3"则表示这些例子和文档可能是针对Flex 3版本的,这是Adobe Flex SDK的一个早期版本,但其核心概念和MVC原则在后续版本中仍然适用。 在压缩包文件名称列表中提到的"pureMVC"很可能是包含所有PureMVC示例项目和...

    android使用mvc小例子

    总结来说,"android使用mvc小例子"是一个很好的实践教程,它演示了如何在Android应用中应用MVC模式,帮助开发者理解如何将业务逻辑、用户界面和数据处理有效地分离开来。通过这个实例,初学者可以深入学习Android...

    QT-PureMVC-master.zip_QT_QT puremvc_mvc_pureMVC_qt MVC

    这是一个MVC例子,简单的接受了MVC的实现过程。

    MVC 例子 MVC 例子

    例如,`eCrossDemoUI`可能是一个使用MVC架构的Web应用示例,其中包含了前端界面、后端逻辑和交互控制。 **开发实践**: 1. **路由**:控制器通常通过URL路由来接收和处理请求。 2. **模板引擎**:视图通常使用模板...

    spring mvc例子

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,专为构建 MVC(Model-View-Controller)架构的应用程序而设计。MVC 模式是一种将业务逻辑、数据和用户界面分离的设计模式,使得开发...

    几个基于mvc架构的小例子

    **描述:“一个用JSF+Servlet+DAO实现的一个小的登入系统,体现了MVC架构思想,存档以备后用。”** 在这个项目中,我们主要探讨的是MVC(Model-View-Controller)架构模式在Web开发中的应用。MVC是一种设计模式,它...

    sping MVC 简单小例子

    在这个"Spring MVC 简单小例子"中,我们将深入探讨如何利用它实现一个基础的"Hello, World!"程序,同时涵盖自定义Filter和ServletResponse的使用。 首先,让我们从Spring MVC的基本结构开始。一个典型的Spring MVC...

Global site tag (gtag.js) - Google Analytics