Java基础(7)图书管理系统
目录
1.前言
2.正文
2.1思路
2.2Book包
2.3people包
2.4operation包
2.5主函数
3.小结
1.前言
哈喽大家好吖,今天来给前面Java基础的学习来一个基础的实战,做一个简单的图书管理系统,这里边综合利用了我们之前学习到的类和对象,继承与多态以及抽象类和接口等许多重要的概念以及知识,事不宜迟,让我们开始吧。
2.正文
2.1思路
在正式开始图书管理系统的代码完成前,我们需要先对一系列所需要创建的对象,各个对象之间的关系,如何实现这种关系,都要有一个提前的规划,下面我通过PlantUML生成了图书管理系统的基础框架,我据图一一解释。
在图书管理系统里面,会参与各种行为的对象都有哪些呢?有书本,借阅者,管理员,具体的借阅功能等,所以我们一共有四个包,分别为:
- Book包
operation包
people
主函数所在包
我们把各个模块把它分成各个包来进行封装,是代码的条理性更好。
2.2Book包
在Book包中,我们创建了俩个对象,一个是book对象,另一个书用于存放书的bookshelf对象,具体实现如下:
package Book;
public class Book {
private String bookName;
private String writer;
private String classification;
private Boolean borrow;
public Book(String bookName, String writer, String classification, Boolean borrow) {
this.bookName = bookName;
this.writer = writer;
this.classification = classification;
this.borrow = borrow;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getClassification() {
return classification;
}
public void setClassification(String classification) {
this.classification = classification;
}
public Boolean getBorrow() {
return borrow;
}
public void setBorrow(Boolean borrow) {
this.borrow = borrow;
}
}
因为成员的访问权限我们设置为private,所以我们需要各种getter和setter方法来调用成员变量,其中getter和setter方法是可以通过系统快速生成的,即按住alt+insert可以快速实现该方法。
下面是Bookshelf对象:
package Book;
public class bookShelf {
private Book[] books = new Book[10];
private int bookNum = 0;
public bookShelf() {
this.books[0] = new Book("三国演义","罗贯中","历史演义",null);
this.books[1] = new Book("三体","刘慈欣","科幻小说",null);
this.books[2] = new Book("西游记","吴承恩","小说",null);
this.bookNum = 3;
}
public Book getBooks(int pos) {
return books[pos];
}
public void setBooks(Book book,int pos) {
this.books[pos] = book;
}
public int getBookNum() {
return bookNum;
}
public void setBookNum(int bookNum) {
this.bookNum = bookNum;
}
}
我们在bookshelf的构造方法中提前初始化里三个对象,即可以理解为图书馆中原本就存放的书。创建一个bookNum变量用于记录当前所存放的图书数量。
2.3people包
在people包中我们通过继承来实现,首先创建了一个person抽象类用于抽取管理员和借阅者的共同属性以及方法,再分别实现子类Admin与normalUser。
person类:
package People;
import operation.*;
import Book.*;
public abstract class Person {
public String name;
public Operation[] iOperations;
public Person(String name) {
this.name = name;
}
public abstract int menu();
public void finishOPerations(int choice,bookShelf bookShelf) {
iOperations[choice].work(bookShelf);
}
}
共同属性姓名不必多说,还额外创建了一个功能数组,另外创建一个菜单方法用于打印各自的菜单,最后还有finishOPeration方法,通过这个功能数组即可实现输入菜单对应选项进入对应功能的操作。
Admin类:
package People;
import operation.*;
import java.util.Scanner;
public class Admin extends Person {
public Admin(String name) {
super(name);
this.iOperations = new Operation[]{
new edit(),
new showBook(),
new findBook(),
new addBook(),
new delBook()
};
}
@Override
public int menu() {
System.out.println("*******************");
System.out.println("**欢迎来到管理员菜单**");
System.out.println("******0.退出系统*****");
System.out.println("******1.显示图书*****");
System.out.println("******2.寻找图书*****");
System.out.println("******3.增加图书*****");
System.out.println("******4.减少图书*****");
System.out.println("*******************");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
在这个构造方法中需要对功能数组中添加功能方法,下文同样。
normalUser类:
package People;
import operation.*;
import java.util.Scanner;
public class normalUser extends Person {
@Override
public int menu() {
System.out.println("*******************");
System.out.println("***欢迎来到用户菜单***");
System.out.println("******0.退出系统*****");
System.out.println("******1.显示图书*****");
System.out.println("******2.寻找图书*****");
System.out.println("******3.借阅图书*****");
System.out.println("******4.归还图书*****");
System.out.println("*******************");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
public normalUser(String name) {
super(name);
this.iOperations = new Operation[]{
new edit(),
new showBook(),
new findBook(),
new borrowBook(),
new returnBook()
};
}
}
2.4operation包
在这个包里面,我们尝试把各种人物的行为全都各个创建成对象来进行分别实现,这里我们采用了接口,即在这个包里接了这个接口的其他对象,都需要将接口中的方法重写,来达到方法都得到实现的目的。
首先是接口:
package operation;
import Book.bookShelf;
public interface Operation {
public void work(bookShelf bookShelf);
}
接口中的方法不需要具体实现。
接下来就是各种需要实现的对象与对象之间的逻辑了,如借阅图书,归还图书,查询图书,退出系统等,我一一进行讲解:
findBook类:
package operation;
import Book.Book;
import Book.bookShelf;
import java.util.Scanner;
//找书先要判断是否有书,若有则借,若无则直接返回
public class findBook implements Operation{
public void work(bookShelf bookShelf){
Scanner scanner = new Scanner(System.in);
System.out.println("查找图书");
String name = scanner.nextLine();
for(int i = 0;i < bookShelf.getBookNum();i++){
if(name.equals(bookShelf.getBooks(i).getBookName())){
System.out.println("找到了《" + name + "》书");
return;
}
}
System.out.println("未找到"+ "《"+ name + "》");
}
}
通过遍历来实现,若遍历到有此书则打印找到了并返回,若能走完遍历则未找到。
showBook类:
package operation;
import Book.bookShelf;
public class showBook implements Operation{
public void work(bookShelf bookShelf) {
System.out.println("显示图书");
//遍历书架
for (int i = 0; i < bookShelf.getBookNum(); i++) {
System.out.println(bookShelf.getBooks(i));
}
}
}
这个遍历打印即可,没什么特殊。
addBook类:
//新增图书,先判断该书是否存在,再实例化一个书对象添加进bookshelf,并将bookNum增加
package operation;
import Book.Book;
import Book.bookShelf;
import java.util.Scanner;
public class addBook implements Operation {
@Override
public void work(bookShelf bookShelf) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入添加的图书名字");
String name = scanner.nextLine();
System.out.println("请输入添加的图书作者名字");
String writer = scanner.nextLine();
System.out.println("请输入添加的图书分类");
String classfication = scanner.nextLine();
//遍历判断是否有相同书
for(int i = 0;i < bookShelf.getBookNum();i++){
if(name.equals(bookShelf.getBooks(i).getBookName())){
System.out.println("书库里已有该书");
return;
}
}
//新增图书
bookShelf.setBooks(new Book(name,writer,classfication,false), bookShelf.getBookNum());
bookShelf.setBookNum(bookShelf.getBookNum() + 1);//新增图书加1
System.out.println("书《" + name +"》已添加成功");
}
}
新增图书是属于Admin对象的类方法,先输入要添加的书的各个成员变量的信息,再遍历寻找有无相同书,若没有则添加。
delBook类:
//删除一本书,现需要查找是否有该书,删书即使后一个覆盖前一个即可
package operation;
import Book.Book;
import Book.bookShelf;
import java.util.Scanner;
public class delBook implements Operation{
@Override
public void work(bookShelf bookShelf) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你需要删除的书");
String name = scanner.nextLine();
for(int i = 0;i < bookShelf.getBookNum();i++){
if(name.equals(bookShelf.getBooks(i).getBookName())){
for(int j = i;j < bookShelf.getBookNum() - 1;j++){
bookShelf.setBooks(bookShelf.getBooks(j + 1),j);
}
bookShelf.setBookNum(bookShelf.getBookNum() - 1);
System.out.println("该书已删除完毕");
return;
}
}
System.out.println("不存在该书");
}
}
也是遍历寻找输入的书,若找到删除的书,则将后面的书一一往前覆盖即可实现删除功能,最后不要忘了bookNum要进行减一操作。
borrowBook类:
package operation;
import Book.Book;
import Book.bookShelf;
import java.util.Scanner;
public class borrowBook implements Operation{
@Override
public void work(bookShelf bookShelf) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要借阅书的名字");
String name = scanner.nextLine();
for(int i = 0;i < bookShelf.getBookNum();i++){
if(name.equals(bookShelf.getBooks(i).getBookName())){
bookShelf.getBooks(i).setBorrow(true);//设置借阅状态
System.out.println("书《" + name +"》借阅成功");
return;
}
}
System.out.println("不存在该书,借阅失败");
}
}
还是先遍历找书,若有则改变图书的借阅状态,若无则借阅失败。
returnBook类:
package operation;
import Book.bookShelf;
import java.util.Scanner;
public class returnBook implements Operation{
@Override
public void work(bookShelf bookShelf) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要归还书的名字");
String name = scanner.nextLine();
for(int i = 0;i < bookShelf.getBookNum();i++){
if(name.equals(bookShelf.getBooks(i).getBookName())){
bookShelf.getBooks(i).setBorrow(false);//设置借阅状态
System.out.println("书《" + name +"》归还成功");
return;
}
}
System.out.println("不存在该书,归还失败");
}
}
和借书操作如出一辙,唯一的区别就是状态改变的true与false不同。
edit类:
package operation;
import Book.bookShelf;
public class edit implements Operation{
@Override
public void work(bookShelf bookShelf) {
for(int i = 0;i < bookShelf.getBookNum();i++){
bookShelf.setBooks(null,i);
}
bookShelf.setBookNum(0);
System.exit(0);
}
}
实现退出功能,先将储存的图书删除,将bookNum清零,最后退出系统。
2.5主函数
在主函数中同样,我们把登陆(即选择自己是管理员还是借阅者身份的选择)的login功能也通过单独的类方法来进行实现。
Login类:
package System;
import People.Admin;
import People.Person;
import People.normalUser;
import java.util.Scanner;
public class Login{
public Person loginIn(){
System.out.println("*欢迎来到图书管理系统**");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的名字");
String name = scanner.nextLine();
System.out.println("*******************");
System.out.println("******1.管理员******");
System.out.println("******2.普通用户****");
System.out.println("请输入你的身份");
if(scanner.nextInt() == 1){
return new Admin(name);
}else{
return new normalUser(name);
}
}
}
最后就是主函数,这个时候主函数就会比较整洁明了,记得要分别实例化书架bookShelf对象以及Login登陆对象了。
package System;
import Book.*;
import People.*;
public class system {
public static void main(String[] args) {
bookShelf bookShelf = new bookShelf();
Login login = new Login();
Person person = login.loginIn();
while(true){
int choice = person.menu();
person.finishOPerations(choice,bookShelf);
}
}
}
这样我们图书管理系统就完成了!
3.小结
今天的图书管理系统的分享到这里就结束了,喜欢的小伙伴不要忘了点一手关注再走哦,欢迎大家在评论区多多交流哦。