MVC框架的简介
在与师姐和团队成员沟通之后,我近期对MVC架构有了新的思考,MVC,就是将一个具体的程序或者可以说成是软件,以模型(model),视图(view),控制器(controller)来组织代码,从而实现业务逻辑,数据,界面显示分离.
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分.通 常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
在此设计框架上实现了分成,分离,在建立比较复杂的应用程序的时候可以在一个时间专门关注一个方面,分离处理.
以数字类,挑选奇偶数为例,在此我也同样考虑运用了简单工厂模式和工厂模式.
在model中,就是数字类,在此实现相应的业务逻辑(奇偶数判断),以及对Controller传来的数据进行处理,并保存在model之中,在此,为了在三者之间可以构成一个环,model之中就有一个UpdateView函数,来通知view更新来显示数据.获取的数据存储在model中.
在Controller中,仅仅是用来传递view传递过来的数据,其中包括数字的集合和view的信息(供之后model来实现调用),在此,其实可以增加很多控制器逻辑.可以对数据进行处理使其得到 的数据能够符合model的需求.
在view中,是提供全部的界面操作,与用户进行联系,从而得到数据,数据可以是用户输入,员可以是网络中获取,并在view中建立相应的可供model的回调机制,可以是一个接口.
view获取数据,与用户交互并在view中调用Controller来传递数据,Controller来处理选择数据,然后传递给Model进行对应的业务处理.从而构成一个闭环.
需要注意的是这里尊重严格的顺序关系,只能由一个箭头的一端传递到 一个端,从而加强封装性,保密性.使调用接口简单化.
下面是改进的JAVA程序
Event.java
package Event;
import NumberModel.NumberX;
public interface Event{
public abstract void updateView(NumberX number);
}
NumberX.java
package NumberModel;
import java.util.*;
import Event.*;
public abstract class NumberX{
public abstract List <Integer> GetNumberList();
public abstract boolean GetType();//获得数字类是属于那种类型的数字类,返回FALSE是奇数,返回TURE是偶数
public abstract void clear();//清除数字类链表中的数据
public abstract void add(Integer i);
public abstract boolean IsThisNumber(Integer i);//用来判断是否是该类型的数
public abstract NumberX GetInstace();
public abstract void Distinguish(List <Integer> list,Event event);//由C层调用传递数据给m层处理
}
OddNumber.java
package NumberModel;
import java.util.*;
import Event.*;
import java.lang.Integer;
public class OddNumber extends NumberX{
private ArrayList <Integer> OddList=new ArrayList<Integer>();//建立私有的链表成员
private OddNumber oddNumber=new OddNumber();//声明为私有的固态变量来建立单体
public OddNumber(){
}
@Override
public void Distinguish(List <Integer> list,Event event){
OddList.clear();
for(int i=0;i<list.size();i++){
if(IsThisNumber(list.get(i))){
OddList.add(list.get(i));
}
}
event.updateView(this);//回调,通知V层更新
}
@Override
public NumberX GetInstace(){
return oddNumber;//通过调用此函数来获取单体的对象
}
@Override
public void clear(){
OddList.clear();
}
@Override
public void add(Integer i){
OddList.add(i);
}
@Override
public boolean IsThisNumber(Integer i){
if(i%2==0)return false;
else return true;
}
public boolean GetType()//获得数字类是属于那种类型的数字类,告诉调用者是奇数
{
return false;
}
@Override
public List<Integer> GetNumberList(){
return OddList;
}
}
EvenNumber.java
package NumberModel;
import java.util.*;
import Event.*;
import java.lang.Integer;
public class OddNumber extends NumberX{
private ArrayList <Integer> OddList=new ArrayList<Integer>();//建立私有的链表成员
private OddNumber oddNumber=new OddNumber();//声明为私有的固态变量来建立单体
public OddNumber(){
}
@Override
public void Distinguish(List <Integer> list,Event event){
OddList.clear();
for(int i=0;i<list.size();i++){
if(IsThisNumber(list.get(i))){
OddList.add(list.get(i));
}
}
event.updateView(this);//回调,通知V层更新
}
@Override
public NumberX GetInstace(){
return oddNumber;//通过调用此函数来获取单体的对象
}
@Override
public void clear(){
OddList.clear();
}
@Override
public void add(Integer i){
OddList.add(i);
}
@Override
public boolean IsThisNumber(Integer i){
if(i%2==0)return false;
else return true;
}
public boolean GetType()//获得数字类是属于那种类型的数字类,告诉调用者是奇数
{
return false;
}
@Override
public List<Integer> GetNumberList(){
return OddList;
}
}
NumberView.java
package NumberView;
import java.util.*;
import Event.*;
import NumberModel.*;
import NumberController.*;
public class NumberView implements Event {//建立视图类
public void ShowNumber(NumberX NumberExample){//用来显示挑选数的数字
List <Integer> List=NumberExample.GetNumberList();//List作为声明来访问数列
if(NumberExample.GetType()==true)
System.out.println("the Evens is:");
else
System.out.println("the odds is:");
for(int i=0;i<List.size();i++){
System.out.print(List.get(i)+" ");
}
}
public void ShowUi(){
int n;
List <Integer>numberList=new ArrayList<Integer>();
Scanner in=new Scanner(System.in);
System.out.println("请输入你要输入的数字的个数");
n=in.nextInt();
System.out.println("请分别输入这些数");
for(int i=0;i<n; i++){
numberList.add(in.nextInt());
}
int type;
System.out.println("请输入你要输入你要挑选奇数还是偶数,奇数输入0,偶数输入1");
n=in.nextInt();
SimpleFactory factory=new SimpleFactory();
factory.NumberDistinguish(numberList,n,this);
}
public void updateView(NumberX number){
ShowNumber(number);
}
}
NumberController.java
package NumberController;
import java.util.*;
import java.lang.Integer;
import Event.*;
import NumberModel.*;
public class NumberController{
private NumberX NumberEx=null;//NumberEx作为所具有的number类的引用
public NumberController(NumberX Nu){//抽象类的构造函数
NumberEx=Nu.GetInstace();//构造函数建立数字类的时候赋值
}
public void NumberDistinguishController(List<Integer> list,Event event)//list为V层传递进来的链表类//event传递视图类的信息事件
{
NumberEx.Distinguish(list,event);
}
public void ChangeNumber(NumberX NumberDate){//用来改变控制器控制的数字类,达到改变
NumberEx=NumberDate.GetInstace();
}
}
simpleFactory.java 也是此程序的controller层
package NumberController;
import java.util.*;
import Event.*;
import NumberController.*;
import NumberModel.*;
public class SimpleFactory{
public SimpleFactory(){
}
public void NumberDistinguish(List <Integer> L,int type,Event event){//event传递视图类的信息事件
NumberController controller;
OddNumber OddNum=new OddNumber();
EvenNumber EvenNum=new EvenNumber();
if(type==0)
controller=new NumberController(OddNum);
else
controller=new NumberController(EvenNum);
controller.NumberDistinguishController(L,event);
}
}
simpleFactoryMain.java 用来开始执行程序
import java.io.*;
import java.util.*;
import NumberView.*;
import NumberController.*;
import NumberModel.*;
public class simpleFactoryMain{
public static void main(String []args){
NumberView view=new NumberView();//建立一个视图类对象
view.ShowUi();//引用函数来显示界面,与用户互动,获取信息
}
}
以下是用C++来实现工厂模式
//Event.h
#include "NumberX.h"
class Event{
public:
virtual void UpdateView(NumberX* );
};
//NumberX.h
#include <iostream>
#include <vector>
#ifndef MAIN_H_
#define MAIN_H_
#include "Event.h"
class NumberX{
public:
virtual std::vector<int> *GetNumberList()=0;
virtual bool GetType()=0;//获得数字类是属于那种类型的数字类,返回0是奇数,返回1是偶数
virtual std::vector<int>*GetNumberVector()=0;//得到向量
virtual void clear()=0;//清楚所有数据
virtual void push(int)=0;//为数字类总增加数据
virtual bool IsThisNumber(int i)=0;//判断该数字是否是属于该数字类
virtual void Distinguish(std::vector<int> list,Event*event)=0;
};
class EvenNumber:public NumberX{
public:
std::vector<int>* GetNumberList();//得到相应的数列的向量
bool GetType();//获得数字类是属于那种类型的数字类,告诉调用者是偶数
std::vector<int>*GetNumberVector(){return &EvenVector;}
void clear(){EvenVector.clear();}//清楚所有数据
void push(int i){EvenVector.push_back(i);}
bool IsThisNumber(int i);//判断该数字是否是属于该数字类
void Distinguish(std::vector<int> list,Event*event){
EvenVector.clear();
for(int i=0;i<list.size();i++)
{
if(IsThisNumber(list.at(i))){
push(list.at(i));
}
}
event->UpdateView(this);//M层的回调来通知V层更新
};
private:
std::vector<int> EvenVector;//作为向量来存储变量
};
bool EvenNumber::IsThisNumber(int i){
if(i%2==0)return 1;
else return 0;
}
std::vector<int> *EvenNumber::GetNumberList(){
return &EvenVector;
}
bool EvenNumber::GetType(){
return 1;
}
class OddNumber:public NumberX{
public:
std::vector<int> *GetNumberList();//得到相应的数列的向量
bool GetType();//获得数字类是属于那种类型的数字类,告诉调用者是偶数
std::vector<int>*GetNumberVector(){return &OddVector;}
void clear(){OddVector.clear();}//清楚所有数据
void push(int i){OddVector.push_back(i);}
bool IsThisNumber(int i){if((i+1)%2==0)return 1;else return 0;}//判断该数字是否是属于该数字类
void Distinguish(std::vector<int> list,Event *event){
OddVector.clear();
for(int i=0;i<list.size();i++)
{
if(IsThisNumber(list.at(i))){
push(list.at(i));
}
}
event->UpdateView(this);
};
private:
std::vector<int> OddVector;//作为向量来存储变量
};
std::vector<int> *OddNumber::GetNumberList(){
return &OddVector;
}
bool OddNumber::GetType(){
return 0;
}
#endif
//Factory.h
#ifndef MAIN_H
#define MAIN_H
#include <iostream>
#include <vector>
#include "NumberX.h"
#include"NumberView.h"
#include "Event.h"
#include "NumberController.h"
class Factory{//抽象工厂,用来分开处理每个具体的工厂
public:
virtual void NumberDistinguish(std::vector<int> NumberVector,Event *event)=0;//NumberVector作为传递进来的样本
};
class EvenFactory:public Factory{
public:
void NumberDistinguish(std::vector<int> NumberVector,Event *event){
EvenNumber evenNumber;
NumberController controller(&evenNumber);
controller.NumberDistinguishController(NumberVector,event);
}
private:
EvenNumber evenVector;//EvenVector作为新建的偶数向量来存储判断的偶数
};
class OddFactory:public Factory{
public:
void NumberDistinguish(std::vector<int> NumberVector,Event *event){//OddVector作为传递进来的样本
OddNumber oddNumber;
NumberController controller(&oddNumber);
controller.NumberDistinguishController(NumberVector,event);
}
private:
OddNumber oddVector;//OddVector作为新建的偶数向量来存储判断的奇数
};
#endif
//NumberController.h
#ifndef MAIN
#define MAIN
#include <iostream>
#include <vector>
#include"Event.h"
#include "NumberX.h"
#include "NumberView.h"
class NumberController{
private:
NumberX *NumberEx;//NumberEx作为所具有的number类
public:
NumberController(NumberX *Nu,NumberView vi){//抽象类的构造函数
NumberEx=Nu;//构造函数建立数字类的时候赋值
}
NumberController(NumberX *Nu){//抽象类的构造函数
NumberEx=Nu;//构造函数建立数字类的时候赋值
}
void NumberDistinguishController(vector<int>list,Event *event)//list为V层传递进来的链表类//event传递视图类的信息事件
{
NumberEx->Distinguish(list,event);
}
};
#endif
//NumberView.h
#ifndef MAIN_H__
#define MAIN_H__
#include <iostream>
#include <vector>
#include "NumberX.h"
#include "Event.h"
using namespace std;
class NumberView:public Event{//建立视图类
public:
void ShowNumber(NumberX *NumberExample);//用来显示挑选数的数字
void ShowUi();
void UpdateView(NumberX*Event);
};
void NumberView::UpdateView(NumberX* number){
ShowNumber(number);
};
void NumberView::ShowUi(){
std::vector<int> NumberVector;
int n,temp;
cout << "请输入你要输入的数字的个数"<<endl;
cin >>n;
cout <<"请分别输入这些数"<<endl;
for(int i=0;i<n;i++){
cin >> temp;
NumberVector.push_back(temp);
}
NumberX *number;
EvenFactory evenFactory;
OddFactory oddFatory;
NumberView view ;
number=evenFactory.NumberDistinguish(NumberVector);
view.ShowNumber(number);
number=oddFatory.NumberDistinguish(NumberVector);
view.ShowNumber(number);
}
void NumberView::ShowNumber(NumberX *NumberExample){//用来显示挑选数的数字
std::vector<int> *v=NumberExample->GetNumberList();//v作为指针来访问数列
if(NumberExample->GetType()==1)
cout<<"the Evens is:"<<endl;
else
cout<<"the odds is:"<<endl;
for (std::vector<int>::iterator it = v->begin() ; it != v->end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
}
void
#endif
//main.cpp
#include <iostream>
#include <vector>
#include "NumberX.h"
#include "NumberView.h"
#include "NumberController.h"
#include "Factory.h"
using namespace std;
// 4 3 2 5 4
int main(){
NumberView view=new View();
view.ShowUi();
}