引言
在我们学习了一些java的基础语法之后,需要把这些知识点可以串起来,这里使用一个简单的小项目可以很好的帮助我们牢记这些知识点,今天就带大家学习一个有关java的小项目,很多学校也经常把这个项目作为他们的课程设计——经典的图书管理系统。(ps:不懂的知识可以看往期文章)
这里必须提前给大家说一下,要想看懂这篇文章,必须得掌握我往期的文章:带你玩转java封装和继承(上),JAVA如何利用接口实现多继承问题。只有看明白这些文章,才能理解本次图书管理系统的代码。链接给大家放这里了~~
http://t.csdnimg.cn/vYS14
http://t.csdnimg.cn/DQynp
图书管理系统界面:
普通用户界面菜单:
1.查找图书
2.新增图书
3.删除图书
4.显示图书
0.退出系统
---------------------------------------------------------------------------------------------------------------------------------
管理员界面菜单:
1.查找图书
2.借阅图书
3.归还图书
0.退出系统
如何搭建基本框架:
首先我们先创建一些项目里一些我们需要用到基础的类来完善我们整个逻辑框架,
首先右击src按步骤创建一个User的包,这个包里首先放的就是我们的的用户类的一些功能和管理员类的一些功能。根据我们上面的需求两者都需要对应的功能菜单。
AdminUser:
public int menu() {
System.out.println("*********管理员菜单***********");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
System.out.println("*****************************");
System.out.println("请输入你的操作:");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
NormalUser:
public int menu() {
System.out.println("*********普通用户菜单***********");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("请输入你的操作:");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
这里有一个细节,不知道你有没有发现,这两段代码的菜单打印我都使用的是int返回值,这是为什么呢,原因其实仔细思考一下就可以得出答案,由于二者的菜单内容的不同我们需要根据不同的对象,打印不同的菜单,为了区分这两个对象我们根据返回值的不同进行区分。现在看不懂没关系,看到后面的代码你就明白了。
User
添加这个类的原因是在AdminUser和NormalUser中有许多共性的部分,我们可以把这些部分抽取出来,创建一个新的类User,只需要继承就好了。
我们还需要一个main方法来测试我们代码的正确性,这里创建一个main类:
public class Main {
public static User login(){
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你的姓名");
String name=scanner.nextLine();
System.out.println("请输入你的身份,1:管理员 2:普通用户");
int choice=scanner.nextInt();
if(choice==1){
AdminUesr adminUesr=new AdminUesr(name);
return adminUesr;
}
else{
NormalUser normalUser=new NormalUser(name);
return normalUser;
}
}
public static void main(String[] args) {
User user= login();
BookList bookList = new BookList();
while(true) {
int choice = user.menu();
user.doIoperations(choice, bookList);
}
}
}
那么我们有了用户的编写,接下来就得管理图书了,同样的,我们新建一个Book包里面存放有关书的一些类,大体上是book类和bookList类,
book:
public class book {
private String name;
private String author;
private int price;
private String type;
private boolean isLend;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isLend() {
return isLend;
}
public void setLend(boolean lend) {
isLend = lend;
}
public book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
(isLend==true ? "已借出" : "未借出")+
// ", isLend=" + isLend +
'}';
}
}
好了,有了书我们还得有一个书架把书管理起来,这里我们创建一个bookList类:
我们给这里直接放了三本书,并且设置了此时书的个数usedSize,这样操作起来比较方便。
好了,上面把基础的一些信息打印好了,现在我们需要实现具体的功能了即:查找图书,添加图书...,那么我如何写这些功能呢,由于用户与管理员的不同,直接以类的形式写比较麻烦,我们这里将所有的功能都以接口的形式实现,你需要哪个功能直接引用就好了。
这里我们创建一个IOperation接口里面实现一个抽象方法(work),当每个功能类引用这个接口之后,都可以用这个work方法来对书架上的书进行操作。
package Operation;
import book.BookList;
public interface IOperation {
void work(BookList bookList);
}
实现业务:
接下来就实现每个功能了:
AddOperation:
public class AddOperation implements IOperation{
public void work(BookList bookList){
System.out.println("新增图书.....");
if (bookList.isFull()) {
System.out.println("书架满了,不能新增图书了!!!");
return;
}
Scanner scanner=new Scanner(System.in);
System.out.println("请输入你要新增的书名:");
String bookName=scanner.nextLine();
System.out.println("请输入你要新增的图书的作者:");
String author=scanner.nextLine();
System.out.println("请输入你要新增的图书价格:");
int price=scanner.nextInt();
System.out.println("请输入你要新增的图书的类型:");
String type=scanner.nextLine();
book book1=new book(bookName,author,price,type);
int currentSize= bookList.getUsedSize();
bookList.setBook(currentSize,book1);
bookList.setUsedSize(currentSize+1);
System.out.println("新增图书成功!");
}
}
这里提前给大家说一下,为了管理方法方便,我们将所有的功能都引用一个IOperation接口,后面创建一个IOperation数组,你的对象需要什么功能直接方到数组里面就好了,这样就完成了不同对象不同功能的实现。
ShowOperation
思路:给方法的参数传一个书架类型bookList,获取当前的书的个数,利用for循环进行打印,总体来说比较简单。
package Operation;
import book.BookList;
import book.book;
public class ShowOperation implements IOperation{
public void work(BookList bookList){
System.out.println("显示图书.....");
int currentSize= bookList.getUsedSize();
for (int i=0;i<currentSize;i++) {
book book1 = bookList.getbooks(i);
System.out.println(book1);
}
}
}
BorrowOperation
思路:首先还是得获取一个书架,这样才可以操作数组里的书,然后输入你要查找的书名,获取书架上书的个数,使用for循环找到你要的书,然后我们这里是将你借走后的书的状态改为true代表这本书被借走。(这里说一下寻找书的时候我们使用equls函数,用于判别两个字符串是否相同)。
package Operation;
import book.BookList;
import java.util.Scanner;
import book.book;
public class BorrowOperation implements IOperation{
public void work(BookList bookList){
System.out.println("借阅图书.....");
System.out.println("请输入你要借阅图书的书名:");
Scanner scanner=new Scanner(System.in);
String bookName=scanner.nextLine();
int currentSize= bookList.getUsedSize();
for(int i=0;i<currentSize;i++){
book book1=bookList.getbooks(i);
if(bookName.equals(book1.getName())){
book1.setLend(true);
System.out.println("找到你要借阅的图书了");
System.out.println(book1);
return;
}
}
System.out.println("没有你要借阅的图书!");
}
}
DelOperation
这里我们对于删除的理解是在这个书架上找到删除的书的下一本,然后依次往上面覆盖,这样完成的删除操作,同时,别忘了删除后一定要将图书的个数减一哦~
比如此时我们要删除红楼梦:
package Operation;
import book.BookList;
import book.book;
import java.util.Scanner;
public class DelOperation implements IOperation{
public void work(BookList bookList){
System.out.println("删除图书.....");
System.out.println("请输入你要删除的书名:");
Scanner scanner=new Scanner(System.in);
String bookName=scanner.nextLine();
int currentSize= bookList.getUsedSize();
int pos=-1;
for (int i=0;i<currentSize;i++) {
book book1=bookList.getbooks(i);
if(book1.getName().equals(bookName)){
pos=i;
break;
}
if(i>=currentSize){
System.out.println("没有你要删除的图书!");
return;
}
for (int j=pos;j<currentSize-1;j++) {
book book2=bookList.getbooks(j+1);
bookList.setBook(j,book2);
}
bookList.setUsedSize(currentSize-1);
bookList.setBook(currentSize-1,null);
System.out.println("删除成功!");
}
}
}
FindOperation
找书的业务有很多种按书名找,按作者找.....这里我们统一采用按书名去找,那么我们选择一个for循环,找到我们需要的书名,最后打印出来。
package Operation;
import book.BookList;
import book.book;
import java.util.Scanner;
public class FindOpertion implements IOperation{
public void work(BookList bookList) {
System.out.println("查找图书.....");
System.out.println("请输入你要查找的图书名:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
//Book book = bookList[i];
book book1 = bookList.getbooks(i);
if (book1.getName().equals(bookName)) {
System.out.println("找到了这本书:");
System.out.println(book1);
return;
}
}
System.out.println("没有你要找的书....");
}
}
ReturnOperation
其实这里和借书的操作基本一致,都是先找到你要操作的书名,后面将书的状态改为false,代表这本书仍然在书架上。
package Operation;
import book.BookList;
import book.book;
import java.util.Scanner;
public class ReturnOPeration implements IOperation{
public void work(BookList bookList){
System.out.println("归还图书.....");
System.out.println("请输入你要归还图书的书名:");
Scanner scanner=new Scanner(System.in);
String bookName=scanner.nextLine();
int currentSize= bookList.getUsedSize();
for(int i=0;i<currentSize;i++){
book book3=bookList.getbooks(i);
if(bookName.equals(book3.getName())){
book3.setLend(false);
return;
}
}
System.out.println("没有你要归还的图书!");
return;
}
}
Showoperation
查看图书也是比较简单的,我们使用for循环,将书架上面的书依次打印出来就好了。
package Operation;
import book.BookList;
import book.book;
public class ShowOperation implements IOperation{
public void work(BookList bookList){
System.out.println("显示图书.....");
int currentSize= bookList.getUsedSize();
for (int i=0;i<currentSize;i++) {
book book1 = bookList.getbooks(i);
System.out.println(book1);
}
}
}