转发请注明原文:http://blog.csdn.net/qq_34911465/article/details/62248450
MVC JAVA
今天用MVC的方法写完一个Java的程序,程序的功能是输入一些数字,然后将偶数和奇数挑出来。
程序的界面是这样的:
以下部分是程序的解析。
MVC是什么
MVC是模型(Model)、视图(View)、控制器(Controller)的缩写,简单而言就是把用户的界面,数据模型还有操作控制的部分分离开来,达到一种解耦合的效果,尽量减少不同的方面对其他的影响,这样在更改其中一部分时不会对其他部分造成影响,降低程序的维护难度。
View
视图,因为对Java语言中的swing和awt编程不是很熟悉,而本来打算直接使用命令行来做视图的,但是命令行的更新效果不明显,所以还是使用swing和awt来编程,一边复习一边编写。
View层的代码如下:
import java.awt.*;
import javax.swing.JFrame;
import java.util.ArrayList;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class View {
private static JFrame frame;
private JTextField[] text;
private JLabel[] textEven;
private JLabel[] textOdd;
private JButton sure;
private Observer observer;
public View(){
super();
initView();
initListener();
}
//初始化界面
public void initView(){
frame = new JFrame("Number");
text = new JTextField[10];
sure = new JButton("test");
frame.setSize(360,150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Below is where you input the number
Box vertical = Box.createVerticalBox();
Box horizontal = Box.createHorizontalBox();
for(int i = 0 ; i < 10 ; i++){
text[i] = new JTextField("");
horizontal.add(text[i]);
}
horizontal.add(sure);
vertical.add(horizontal);
frame.add(vertical);
//Below is where show the result
JLabel evenLabel = new JLabel("Below is the even number:");
JLabel oddLabel = new JLabel("Below is the odd number:");
textEven = new JLabel[10];
textOdd = new JLabel[10];
Box evenH = Box.createHorizontalBox();
Box oddH = Box.createHorizontalBox();
for(int i = 0 ; i < 10 ; i++){
textEven[i] = new JLabel(" ");
evenH.add(textEven[i]);
}
for(int i = 0 ; i < 10 ; i++){
textOdd[i] = new JLabel(" ");
oddH.add(textOdd[i]);
}
vertical.add(evenLabel);
vertical.add(evenH);
vertical.add(oddLabel);
vertical.add(oddH);
}
public void initListener(){
//turn to calculate
sure.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//触发信号
observer = Controller.getInstance();
observer.updateSignal(1);
}
});
}
public void setVisible(boolean flag){
frame.setVisible(flag);
}
//上传视图中的数据
public ArrayList<Data> uploadData(){
Data data;
ArrayList<Data> list = new ArrayList<Data>();
for(int i = 0 ; i < 10 ; i++){
data = new Data(Integer.parseInt(text[i].getText()));
list.add(data);
}
return list;
}
//更新视图
public void updateView(ArrayList<Data> evenList,ArrayList<Data> oddList){
for(int i = 0 ; i < 10 ; i++){
textEven[i].setText(" ");
textOdd[i].setText(" ");
}
if(evenList!=null)
for(int i = 0,len = evenList.size(); i < len ; i++){
textEven[i].setText(" "+evenList.get(i).getNum()+" ");
}
if(oddList!=null)
for(int i = 0,len = oddList.size(); i < len ; i++){
textOdd[i].setText(" "+oddList.get(i).getNum()+" ");
}
}
}
Model
模型,保存数据
首先是数据
public class Data{
private int num;
public Data(){};
public Data(int n){num = n;}
public void setNum(int n){
num = n;
}
public int getNum(){
return num;
}
public boolean isEven(){
return (num%2==0);
}
}
数据模型类
import java.util.ArrayList;
public class Model{
private ArrayList<Data> evenList;
private ArrayList<Data> oddList;
public Model(){
init();
}
public void init(){
evenList = new ArrayList<Data>();
oddList = new ArrayList<Data>();
}
public void clear(){
evenList.clear();
oddList.clear();
}
public void addToEvenList(Data data){
evenList.add(data);
}
public void addToOddList(Data data){
oddList.add(data);
}
public ArrayList<Data> getEvenList(){
return evenList;
}
public ArrayList<Data> getOddList(){
return oddList;
}
}
Controller
控制器,对数据进行处理,以及控制视图的更新
import java.lang.Exception;
import java.util.ArrayList;
public class Controller implements Observer{
private static Controller instance = new Controller();
private View view;
private Model model;
public Controller(){
init();
}
public void init(){
view = new View();
model = new Model();
view.setVisible(true);
}
public static Controller getInstance(){
return instance;
}
public void addData(Data data){
if(data!=null&&data.isEven())model.addToEvenList(data);
else if(data!=null&&!data.isEven())model.addToOddList(data);
}
public void setList(ArrayList<Data> list){
model.clear();
for(int i = 0 , len = list.size();i < len ; i++){
addData(list.get(i));
}
}
//接受到信号就会加载视图中的数据,然后将数据处理后保存到模型中
public void updateSignal(int n){
if(n==1){
ArrayList<Data> list = view.uploadData();
setList(list);
ArrayList<Data> eList = model.getEvenList();
ArrayList<Data> oList = model.getOddList();
view.updateView(eList,oList);
}
}
}
单这样还是无法让程序正常的运行,所以我们需要在视图中添加一个观察者,使用观察者来探测视图的变化。
public interface Observer {
public void updateSignal(int n);
}
这里我让Controller继承了观察者,这样观察者就可以直接操作Controller中的updateSignal方法,来进行视图的更新。
接下来就是main函数,使用一个另外的类
import java.lang.Exception;
public class MyMain{
private Controller controller;
public MyMain(){
init();
}
public void init(){
controller = Controller.getInstance();
}
public static void main(String[] args){
try{
MyMain m = new MyMain();
}catch(Exception e){
System.out.println(e);
}
}
}
测试结果如下:
输入整型数据后按test键,就会输出下图的结果: