这学期有一门软件体系结构的实验课,刚过去的一个星期做了一个关于MVC框架的实验
实验也简单,就是在原有的JAVA程序代码基础上改动一下,在视图中加一些功能。虽简单
但是其中的MVC思想还是很典型的。
一.MVC简介
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法,这个方法的假设前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的
是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。模型-视图-控制器(MVC)是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
二.MVC是框架模式并不是设计模式
有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式。实际上它们完全是不同的概念。框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,
以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用
代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。
框架模式有哪些?
MVC、MTV、MVP、CBD、ORM等等;
框架有哪些?
C++语言的QT、MFC、gtk,Java语言的SSH 、SSI,php语言的 smarty(MVC模式),python语言的django(MTV模式)等等
设计模式有哪些?
工厂模式、适配器模式、策略模式等等
简而言之:设计模式是大智慧,用来对软件设计进行分工;框架模式是小技巧,对具体问题提出解决方案,以提高
代码复用率,降低耦合度。
三.例子(就是我的实验)
1.首先是包中的主程序,位于com下,全路径com.MainFrame.java
/*
* MainFrame.java
*/
package com;
import com.controller.Controller;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.awt.event.*;
import javax.swing.*;
import com.view.*;
import com.model.CircleModel;
public class MainFrame extends JFrame{
public CircleModel model;
public ViewPanel vp;
public RTextField rTextField;
public CTextField cTextField;
public STextField sTextField;
public ControlSlider slider;
public BTextField bTextField;
public DTextField dTextField;//
private JPanel topPanel = new JPanel();
private JPanel bottomPanel = new JPanel();
public JButton jButton1 = new JButton("更新");
private JLabel jLabel1 = new JLabel("半径");
private JLabel jLabel2 = new JLabel("周长");
private JLabel jLabel3 = new JLabel("面积");
private JLabel jLabel4 = new JLabel("球面积");
//private JLabel jLabel5 = new JLabel("直径");
/** Creates a new instance of MainFrame */
public MainFrame(String title) {
super.setTitle(title);
initComponent();
new Controller(this);
}
private void initComponent(){
model=new CircleModel(10.0);
vp &#