昨天以集合List方法优化了用数组实现迷你DVD管理器的功能,今天学习了MVC框架后采用MVC框架重写了一遍迷你DVD管理器,虽然代码量没有减少甚至有所增加,但是实现了高内聚,低耦合,这也是MVC框架编码的一大优势,以后写项目的时候一般都采用这种模式写。
首先我创建了五个(package)包,分别取名为com.org.entity(存放实体类,用来封装数据,也叫数据模型层);com.org.action(存放视图类);com.org.dao(存放模型,此题将数据存在在集合中);com.org.service(控制器,从action获取数据传给dao);com.org.test(存放测试类);
在视图类中,定义了显示菜单,选择菜单和访问菜单三个静态方法,用来显示界面。
对于service和dao这两个包,每个包中各包含一个接口(接口中定义要实现的增删改查,归还借阅等功能的方法),然后包含一个接口实现类,重写接口中的方法从而实现DVD管理器的功能。这里说明下由于迷你DVD管理器程序比较简单,所以控制类中就只是简单的传对象,并没有对其进行控制判断。所以目前看来这个控制类就显得有点累赘,但是后期开发中当数据较多且数据类型较多的时候,这个控制类就变的至关重要,不符合条件的对象参数不会被传入模型类,会大大节省调试的时间。
test包中直接通过DVDAction调用showMenu()的静态方法,实现程序的运行。
下面是程序实现的代码:
com.org.entity:
package com.org.entity;
public class DVD {
public String name;
public int state;// (1:可借,0:不可借)
public String date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public DVD(int state, String name) {
this.name = name;
this.state = state;
}
public DVD(int state, String name, String date) {
this.name = name;
this.state = state;
this.date = date;
}
public DVD() {
}
}
com.org.action:
package com.org.action;
import java.util.Scanner;
import com.org.service.DVDService;
import com.org.service.DVDServiceImpl;
public class DVDAction {
static Scanner input = new Scanner(System.in);
public static void returnMenu() {
System.out.print("输入0返回:");
int i = input.nextInt();
// 如果输入0返回显示菜单
if (i == 0) {
showMenu();
} else {
System.out.println("系统退出!");
input.close();
}
}
public static void showMenu() {
System.out.println("欢迎使用迷你DVD管理器");
System.out.println("--------------------------------------------");
System.out.println("1.新增DVD");
System.out.println("2.查看DVD");
System.out.println("3.删除DVD");
System.out.println("4.借出DVD");
System.out.println("5.归还DVD");
System.out.println("6.退出DVD");
System.out.println("--------------------------------------------");
// 选择菜单,由于是静态的所以可以直接调用
choiceMenu();
}
static DVDService dvdService = new DVDServiceImpl();
public static void choiceMenu() {
System.out.println("请选择:");
int key = input.nextInt();
switch (key) {
case 1:
System.out.println("--- >新增DVD");
String name = null;
dvdService.addDVD(name);
returnMenu();
break;
case 2:
System.out.println("查看DVD");
System.out.println("序号\t状态\t名称\t借出日期");
dvdService.lookDVD();
returnMenu();
break;
case 3:
System.out.println("删除DVD");
System.out.println("请输入删除DVD的序号:");
int count = 0;
dvdService.delDVD(count);
returnMenu();
break;
case 4:
System.out.println("借出DVD");
String name1 = null;
dvdService.borrowDVD(name1);
returnMenu();
break;
case 5:
System.out.println("归还DVD");
String name2 = null;
String date = null;
dvdService.returnDVD(name2, date);
returnMenu();
break;
case 6:
System.out.println("退出系统!");
System.exit(0);
break;
default:
break;
}
}
}
com.org.service:
接口:
package com.org.service;
public interface DVDService {
//增加DVD
void addDVD(String name);
//删除
void delDVD(int count);
//查找
void lookDVD();
//归还DVD
void returnDVD(String name, String date);
//借阅DVD
void borrowDVD(String name);
}
接口实现类:
package com.org.service;
import com.org.dao.DVDDao;
import com.org.dao.DVDDaoImpl;
public class DVDServiceImpl implements DVDService {
DVDDao dvdDao = new DVDDaoImpl();
@Override
public void addDVD(String name) {
// TODO Auto-generated method stub
dvdDao.addDVD(name);
}
@Override
public void delDVD(int count) {
// TODO Auto-generated method stub
dvdDao.delDVD(count);
}
@Override
public void lookDVD() {
// TODO Auto-generated method stub
dvdDao.lookDVD();
}
@Override
public void returnDVD(String name, String date) {
// TODO Auto-generated method stub
dvdDao.returnDVD(name, date);
}
@Override
public void borrowDVD(String name) {
// TODO Auto-generated method stub
dvdDao.borrowDVD(name);
}
}
com.org.dao:
接口类:
package com.org.dao;
public interface DVDDao {
void addDVD(String name);
void delDVD(int count);
void lookDVD();
void returnDVD(String name, String date);
void borrowDVD(String name);
}
接口实现类:
package com.org.dao;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import com.org.entity.DVD;
public class DVDDaoImpl implements DVDDao {
static Scanner input = new Scanner(System.in);
private static List<DVD> list = new ArrayList<DVD>();
static {
DVD d1 = new DVD(1, "罗马假日", "2017-7-1");
DVD d2 = new DVD(0, "风声鹤唳", "");
DVD d3 = new DVD(0, "浪漫满屋", "");
list.add(d1);
list.add(d2);
list.add(d3);
}
@Override
public void addDVD(String name) {
// TODO Auto-generated method stub
if (list.size() == 6) {
System.out.println("对不起,货架已满");
}
System.out.println("请输入DVD名称:");
String name01 = input.next();
DVD dvd01 = new DVD(0, name01, "");
list.add(dvd01);// 通过list中的add方法添加DVD
System.out.println("新增《" + name01 + "》成功!");
}
@Override
public void delDVD(int count) {
// TODO Auto-generated method stub
System.out.println("可删除的DVD如下:");
System.out.println("序号\t状态\t名称");
Iterator<DVD> it = list.iterator();
int count1 = 0;// 序号初始化
while (it.hasNext()) {
DVD dvd1 = (DVD) it.next();
if (dvd1.getName() != null) {
if (dvd1.getState() == 0) {
String state = (dvd1.getState() == 0) ? "可借" : "不可借";
count1++;
System.out.println(count1 + "\t" + state + "\t" + dvd1.getName());
}
}
}
System.out.print("请选择要删除的DVD序号:");
int id = input.nextInt();
System.out.println("删除" + list.get(id).getName() + "成功");
list.remove(id);// 调用list中的remove()删除相应索引的元素
}
@Override
public void lookDVD() {
// TODO Auto-generated method stub
Iterator<DVD> it = list.iterator();
int count = 0;
while (it.hasNext()) {
DVD dvd = (DVD) it.next();
String state = (dvd.getState() == 0) ? "可借" : "不可借";// 三目运算符判断若状态是0则为可借,否则不可借
count++;
System.out.println(count + "\t" + state + "\t" + dvd.getName() + "\t" + dvd.getDate());
}
}
@Override
public void returnDVD(String name, String date) {
// TODO Auto-generated method stub
boolean isreturn = true;
System.out.println("请输入归还的DVD名称:");
String name4 = input.next();
Iterator<DVD> it = list.iterator();
while (it.hasNext()) {
DVD dvd = (DVD) it.next();
if (dvd.getName() != null && name4.equals(dvd.getName()) && dvd.getState() == 1) {// 归还的DVD状态为不可借
isreturn = true;
System.out.println("请输入归还日期:");
String returnDate = input.next();
double charge = 0;
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");// 设置时间格式为年-月-日
try {
java.util.Date d1 = sd.parse(dvd.getDate());
java.util.Date d2 = sd.parse(returnDate);
charge = (d2.getTime() - d1.getTime()) / (24 * 3600 * 1000); // 计算租金
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("归还成功!");
System.out.println("借出日期为:" + dvd.getDate());
System.out.println("归还日期为:" + returnDate);
System.out.println("应付租金(元):" + charge);
dvd.setDate(null);// 归还之后设置时间为空
dvd.setState(0);// 归还后设置状态为可借
isreturn = false;
} else if (dvd.getName() != null && name4.equals(dvd.getName()) && dvd.getState() == 0) {
isreturn = false;
System.out.println("此DVD未借出,归还失败!");
break;
}
}
if (isreturn) {
System.out.println("您要归还的DVD不在借出之列,请您核对后再进行操作!!!");
}
}
@Override
public void borrowDVD(String name) {
// TODO Auto-generated method stub
boolean isborrow = false;
System.out.println("可借的DVD如下:");
System.out.println("序号\t状态\t名称");
int count = 0;// 序号初始化
Iterator<DVD> it = list.iterator();
while (it.hasNext()) {
DVD dvd3 = (DVD) it.next();
if (dvd3.getName() != null && dvd3.getState() == 0) {// 遍历list,DVD存在且状态为可借,输出DVD信息
String state = (dvd3.getState() == 0) ? "可借" : "不可借";
count++;
System.out.println(count + "\t" + state + "\t" + dvd3.getName());
}
}
System.out.println("请输入要借的DVD名称:");
String name3 = input.next();
Iterator<DVD> ite = list.iterator();
while (ite.hasNext()) {
DVD dvd4 = (DVD) ite.next();
if (dvd4.getName() != null && name3.equals(dvd4.getName()) && dvd4.getState() == 0) {// 如果需要借的DVD在list中存在且状态可借
System.out.println("请输入借出的日期:");
String date = input.next();
dvd4.setDate(date);
dvd4.setState(1);
System.out.println("借出《" + dvd4.getName() + "》成功!");
isborrow = true;
break;
}
}
if (!isborrow) {
System.out.println("您要借出的DVD名称不存在,请您核实后再进行操作!!!");// 无此DVD提示
}
}
}
com.org.test:
package com.org.test;
import com.org.action.DVDAction;
public class DVDTest {
public static void main(String[] args) {
DVDAction.showMenu();
}
}