本文主要是基于快递管理系统的设计,来介绍MVC模式相关内容。
一、什么是MVC模式?
MVC(Model - View - Controller)是软件工程中的一种软件架构模式,它将系统分为三个部分,分别为:模型、视图和控制器。
1、模型(Model):表示数据的存取。用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,Model有对数据直接访问的权力。
2、视图(View):表示视图效果。能够实现数据有目的的显示。一般在视图中不涉及程序的逻辑。在视图中也体现了面向对象的思想,将想给用户展示的信息封装成一个View类。
3、控制器(Controller):表示调用逻辑。程序入口,负责相应用户操作并调用相应的业务逻辑模块完成整个功能需求。
二、MVC模式的目的
主要是实现一种动态的程序设计,简化后续对程序的修改和扩展,并且使程序某一部分的重用成为可能,同时使程序结构更为直观。软件系统在分离了自身的基本部分的同时,也赋予了各个基本部分应有的功能。
个人理解:一般情况下,可以认为视图层与模型层是存在直接联系的,模型的变化可以通过视图层反映出来。
三、MVC流程
1、View接受用户的交互请求
2、View将请求转交给Controller
3、Controller操作Model进行数据更新
4、数据更新之后,Model通知View数据变化
5、View显示更新之后的数据
四、优缺点(不展开叙述)
1、优点
1)低耦合
2)重用性高
3)生命周期短
4)部署快
5)可维护性高
2、缺点
1)没有明确的定义
2)不适合中小型应用程序
3)增加系统结构和实现的复杂性
4)视图对模型数据的低效率访问
五、基于快递管理系统的代码实例
任务描述:
涉及知识点:
1、面向对象
2、集合
3、MVC模型
模块图:
1、View层
主要是一些输出信息,不涉及逻辑。
public class View {
Scanner input = new Scanner(System.in);
public void welcome(){
System.out.println("欢迎使用快递柜~");
}
public void bye(){
System.out.println("再见,欢迎下次使用!");
}
/**
* 身份选择菜单
* @return
*/
public int menu(){
System.out.println("请根据相应提示,输入功能序号:");
System.out.println("1.管理员");
System.out.println("2.普通用户");
System.out.println("0.退出");
String text = input.nextLine();
int num = -1;
try{
num = Integer.parseInt(text);
}catch(NumberFormatException e){
}
if(num<0||num>2){
System.out.println("输入有误,请重新输入");
return menu();
}
return num;
}
/**
* 快递员的操作
* @return
*/
public int cMenu(){
System.out.println("请根据相应提示,输入功能序号:");
System.out.println("1.快递录入");
System.out.println("2.修改快递");
System.out.println("3.删除快递");
System.out.println("4.查看所有快递");
System.out.println("0.返回上一级");
String text = input.nextLine();
int num = -1;
try{
num = Integer.parseInt(text);
}catch(NumberFormatException e){
}
if(num<0||num>4){
System.out.println("输入有误,请重新输入");
return cMenu();
}
return num;
}
/**
* 录入快递
*/
public Model insert(){
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入快递单号:");
String number = input.nextLine();
System.out.println("请输入快递公司:");
String company = input.nextLine();
Model m = new Model();
m.setNumber(number);
m.setCompany(company);
return m;
}
/**
* 提示输入快递单号,根据单号来查找快递
* @return
*/
public String findByNumber(){
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入要操作的快递单号:");
String number = input.nextLine();
return number;
}
public void print(Model m){
System.out.println("快递信息如下:");
System.out.println("快递公司:"+m.getCompany()+",快递单号:"+m.getNumber()+",取件码:"+m.getCode());
}
public void update(Model m){
System.out.println("请输入新的快递单号:");
String number = input.nextLine();
System.out.println("请输入新的快递公司:");
String company = input.nextLine();
m.setCompany(company);
m.setNumber(number);
}
public int delete(){
System.out.println("是否确认删除?\n 1.确认删除\n 2.取消操作");
String number = input.nextLine();
int num = -1;
try{
num = Integer.parseInt(number);
}catch (NumberFormatException e){
}
if(num<1||num>2){
System.out.println("输入有误,请重新输入");
return delete();
}
return num;
}
public void printAll(Collection<Model>ms){
int count = 0;
for (Model m:ms) {
count++;
System.out.println("第"+(m.posX+1)+"排"+(m.posY+1)+"列");
print(m);
}
if(count==0){
System.out.println("暂无快递信息!");
}
}
public int userMenu(){
System.out.println("请根据提示,进行取件");
System.out.println("请输入您的取件码:");
String code = input.nextLine();
int num = -1;
try{
num = Integer.parseInt(code);
}catch (NumberFormatException e){
}
if(num<100000||num>999999){
System.out.println("输入有误,请重新输入");
return userMenu();
}
return num;
}
public void success(){
System.out.println("操作成功!");
}
public void exist(){
System.out.println("此快递单号已存在!");
}
public void printNull(){
System.out.println("快递不存在!");
}
}
2、Model层
主要是快递信息
public class Model {
private String number;
private String company;
private int code;
public int posX,posY;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Model(String number, String company, int code) {
this.number = number;
this.company = company;
this.code = code;
}
public Model() {
}
@Override
public String toString() {
return "Model{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Model model = (Model) o;
return code == model.code &&
Objects.equals(number, model.number) &&
Objects.equals(company, model.company);
}
@Override
public int hashCode() {
return Objects.hash(number, company, code);
}
}
3、Controller层
public class Controller {
boolean[][] cabinet = new boolean[10][10];
HashMap<Integer,Model> data = new HashMap<>();
Collection<Model> models = data.values();
private int size;
private Random r = new Random();
public boolean add(Model m){
if(size>=100){
System.out.println("快递柜已满,不能存储快递!");
return false;
}
int x = -1;
int y = -1;
while(true){
x = r.nextInt(10);
y = r.nextInt(10);
if(cabinet[x][y]==false){
break;
}
}
int code = randomCode();
m.setCode(code);
m.posX = x;
m.posY = y;
cabinet[x][y] = true;
data.put(code,m);
return true;
}
public int randomCode(){
while(true){
int code = r.nextInt(900000)+100000;
Model m = findByCode(code);
if(m==null){
return code;
}
}
}
public Model findByCode(int code){
for (Model m:models) {
if(m.getCode()==code){
return m;
}
}
return null;
}
public Model findByNumber(String number){
for (Model m:models) {
if(m.getNumber().equals(number)){
return m;
}
}
return null;
}
public void update(Model oldModel,Model newModel){
delete(oldModel);
add(newModel);
}
public void delete(Model m) {
data.remove(m.getCode());
cabinet[m.posX][m.posY] = false;
size--;
}
public Collection<Model> findAll(){
return models;
}
}
4、Main
public class Main {
private static View view = new View();
private static Controller controller = new Controller();
public static void main(String[] args) {
view.welcome();
m:while(true){
int menu = view.menu();
switch(menu){
case 0:
break m;
case 1:
cClient();
break ;
case 2:
uClient();
break ;
}
}
view.bye();
}
private static void cClient() {
while(true){
int menu = view.cMenu();
switch(menu){
case 0:
return;
case 1:{
Model m = view.insert();
Model m2 = controller.findByNumber(m.getNumber());
if(m2==null){
controller.add(m);
view.print(m);
}
else{
view.exist();
}
}
break;
case 2:{
String number = view.findByNumber();
Model m = controller.findByNumber(number);
Model m2 = m;
if(m==null){
view.printNull();
}else{
view.print(m);
view.update(m2);
controller.update(m,m2);
view.print(m2);
}
}
break;
case 3:{
String number = view.findByNumber();
Model m = controller.findByNumber(number);
if(m==null){
view.printNull();
}else{
view.print(m);
int type = view.delete();
if(type==1){
controller.delete(m);
view.success();
}
}
}
break;
case 4:{
Collection<Model> data = controller.findAll();
view.printAll(data);
}
break;
}
}
}
public static void uClient(){
int code = view.userMenu();
Model m = controller.findByCode(code);
if(m==null){
view.printNull();
}else{
view.success();
view.print(m);
controller.delete(m);
}
}
}
5、运行结果:
后期会使用IO技术继续完善快递管理系统。