《JAVASE系列》一个小小的图书管理系统
文章目录
前言:
本章学习内容:
一个小小的图书管理系统
由于这仅仅是一个语法的训练小项目,并不会有前端页面以及复杂的数据库,仅仅只能实现很普通的功能。
图书系统的产品思维
- 图书系统会有欢迎界面,可以输入姓名,输入后会打印出欢迎的语句出来。
- 图书系统会提醒你选择管理员身份或者普通用户的身份。
- 如果选择管理员身份,可以有以下五个功能:
- 查找图书
- 新增图书
- 删除图书
- 显示图书
- 退出系统
- 如果选择普通用户身份,可以有以下五个功能:
- 查找图书
- 借阅图书
- 归还图书
- 退出系统
- 每一次系统都会初始化都会为系统提供《三体》一整套书籍。
图书系统的基本框架:
1. 实现 书与书架。
创建一个book文件夹,以下包含两个类,书与书架
实现书类
每本书会有以下五个基本信息:
- 书名
- 作者
- 类型
- 价钱
- 借阅的状态:是未借出还是被借出
将这五个信息输入书籍。
并且我们为书类提供一个构造方法,使得我们能够在未来对这个书类录入信息。
同时我们由于有查找图书与显示图书的功能,我们未来也需要用书类来打印出书籍的信息,所以提供一个tostring方法。
书类 实现如下:
public class Book {
//书的信息
private String bookname;
private String author;
private String type;
private double price;
private boolean status;
// 构造方法
public Book(String bookname, String author, String type, double price) {
this.bookname = bookname;
this.author = author;
this.type = type;
this.price = price;
}
//tostring方法
@Override
public String toString() {
return "Book{" +
"bookname='" + bookname +
", author='" + author +
", price=" + price +
((status==true)?" 已借出":" 未借出");
//三目操作符
}
}
实现书架
书架的主要目的是为了存储书籍。
实现思维:
我们希望书架会有一个基本的大小,创建一个Book类的数组来存储书籍。并且为了满足产品思维,我们可以实现一个构造方法来实现在每一次进入系统都会初始化好三体的三部曲。同时为了能够知晓书架中的书籍个数以及更好的操作书架,我们提供一个int变量来记录书籍的数量,并为这个变量提供get和set方法。
实现代码:
public class Booklist {
Book[] books = new Book[10]; //书架的大小
private int booksize = 0; //记录书籍数量
//为书架放入三体三部曲
public Booklist(){
books[0] = new Book("三体Ⅰ","刘慈欣","科幻小说",52);
books[1] = new Book("三体Ⅱ:黑暗森林","刘慈欣","科幻小说",52);
books[2] = new Book("三体Ⅲ:死神永生","刘慈欣","科幻小说",52);
this.booksize = 3;
//书籍数量
}
//get set方法 来获取书籍数量
public int getBooksize() {
return booksize;
}
public void setBooksize(int booksize) {
this.booksize = booksize;
}
}
2. 实现 图书系统的功能:
创建一个operation文件夹,讲操作的功能统一放入这个文件夹
在底下创建总共七个功能的类以及接口
为什么要接口:
为了实现多态并且提供给操作方法一个统一的规范。
由于只是搭建一个基本的框架,所以功能暂时不实现。
功能基本框架代码:
Addoperation
package operation;
import book.Booklist;
public class Addoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("增加图书");
}
}
Backoperation
package operation;
import book.Booklist;
public class Backoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("归还图书");
}
}
Borrowoperation
package operation;
import book.Booklist;
public class Borrowoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("借阅图书");
}
}
Deleoperation
package operation;
import book.Booklist;
public class Deleoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("删除图书");
}
}
Displayoperation
package operation;
import book.Booklist;
public class Displayoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("显示图书");
}
}
Exitoperation
package operation;
import book.Booklist;
public class Exitoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("退出系统");
}
}
Findoperation
package operation;
import book.Booklist;
public class Findoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("查阅图书");
}
}
接口:IOperation
对work方法进行规范
package operation;
import book.Booklist;
public interface Ioperation {
public void work(Booklist booklist);
}
3.实现 用户
创建一个user文件夹:
用户会有自己的名称
所以我们创建一个抽象父类,作为管理员身份与普通用户的共有信息,并实现多态
提供构造方法初始化对象。
由于进入系统时需要有管理员提示菜单与普通用户菜单,所以提供一个抽象方法meu,来实现多态。
提供get 和 set 方法修改和获取用户名称。
package User;
import operation.Ioperation;
abstract public class User {
protected String name;
public User(String name){
this.name = name;
}
public abstract int meu();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
普通用户与管理员:
- 构造方法初始化管理员名称
- 继承抽象父类User
- 实现接口,使得用户可以操作图书系统
- 实现提示菜单,并选择不同的功能
- 提供操作图书馆的方法。
普通用户:
package User;
import book.Booklist;
import operation.Ioperation;
import java.util.Scanner;
public class Normaluser extends User {
public Normaluser(String name) {
super(name);
}
@Override
public int meu() {
System.out.println(this.name+"用户你好呀,欢迎来到这个图书系统哦!");
System.out.println("请选择以下选项:");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
管理员:
package User;
import book.Booklist;
import operation.Ioperation;
import java.util.Scanner;
public class Adminuser extends User {
public Adminuser(String name) {
super(name);
}
@Override
public int meu() {
System.out.println(this.name+"管理员你好呀,欢迎来到这个图书系统哦!");
System.out.println("请选择以下选项:");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
4.Main
提供一个登录方法来实现最开始的欢迎界面,并且可以选择管理员身份或者普通用户。
实现代码:
我们通过父类作为返回值来接受子类对象,实现了对管理员与普通用户的选择。
import User.*;
import java.util.Scanner;
public class Main {
public static User login() {
System.out.println("这里是图书管理系统");
System.out.println("请输入你的名字:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("管理员请输入1,普通用户请输入0!");
int choice = scanner.nextInt();
if (choice == 1) {
return new Adminuser(name);
} else {
return new Normaluser(name);
}
}
public static void main (String[]args){
User user = login();
int choice = user.meu();
}
}
对图书系统的操作:
1.通过接口数组来操作图书系统
在用户中通过实现接口数组来操作图书系统:
在父类用户user初始一个接口数组 与 doOperation方法:
public Ioperation[] ioperations;
public void doOperation(int choice,Booklist booklist) {
ioperations[choice].work(booklist);
}
但是我们不对他进行初始化,因为我们不知道子类中需要的大小,所以我们留到子类中去初始化。
doOperation来实现对不同选择的实现。
在普通用户子类中实现接口数组:
4个功能,初始化接口数组,通过对应接口数组下标来调用对应功能的work方法,实现多态:
在构造方法中初始化。
public Normaluser(String name) {
super(name);
this.ioperations = new Ioperation[]{
new Exitoperation(),
new Findoperation(),
new Borrowoperation(),
new Exitoperation()
};
}
在管理员子类中实现接口数组
5个功能,初始化接口数组,通过对应接口数组下标来调用对应功能的work方法,实现多态:
在构造方法中初始化。
public Adminuser(String name) {
super(name);
this.ioperations = new Ioperation[] {
new Exitoperation(),
new Findoperation(),
new Borrowoperation(),
new Exitoperation()
};
}
在Main中实现重复选择不同功能:
while(true){
int choice = user.meu();
user.doOperation(choice, booklist);
}
2.实现各个操作类的功能:
添加书籍: Addoperation
我们通过提示用户输入书名,作者,类型,价格
再将得到的数据通过构造方法生成一本新书
或者书架中书籍的个数,由于数组下标初始为0,所以以书籍个数作为数组下标的元素为空,将书籍放入这个位子中。(通过booklist类中的setpos)
由于booklist类中并没有getpos和setpos类,所以我们需要定义这两个方法
public Book getpos(int sz){ return books[sz]; } public void setpos(int sz,Book book){ books[sz] = book; }
并通过booklist类的setBooksize将书架中 书籍的个数加1
public class Addoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("增加图书");
System.out.println("请输入你要添加书籍的名字:");
Scanner scanner = new Scanner(System.in);
String bookname = scanner.nextLine();
System.out.println("书的作者是?");
String author = scanner.nextLine();
System.out.println("书的类型是?");
String type = scanner.nextLine();
System.out.println("书的价格是?");
int price = scanner.nextInt();
Book book = new Book(bookname,author,type,price);
int currsize = booklist.getBooksize();
booklist.setpos(currsize,book);
booklist.setBooksize(currsize+1);
System.out.println("新增成功");
}
归还书籍:Backoperation
通过提醒用户输入要归还书籍的名字,通过遍历书架比较书架中书籍的名称与要归还的书籍名称是否一致来实现,归还成功则将书籍的状态设置为flase
package operation;
import book.Booklist;
import java.util.Scanner;
public class Backoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("归还图书");
System.out.println("请输入你要归还书籍的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
if(name.equals(booklist.getpos(i).getBookname())==true){
booklist.getpos(i).setStatus(false);
System.out.println("归还成功");
break;
}
}
if(i==currsize){
System.out.println("没有找到你要归还的书籍");
}
}
}
借阅书籍:Borrowoperation
通过提醒用户输入要借阅书籍的名字,通过遍历书架比较书架中书籍的名称与要归还的书籍名称是否一致来实现,归还成功则将书籍的状态设置为true
import book.Booklist;
import java.util.Scanner;
public class Borrowoperation implements Ioperation {
public void work(Booklist booklist) {
System.out.println("借阅图书");
System.out.println("请输入你要借阅书籍的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
if (name.equals(booklist.getpos(i).getBookname()) == true) {
booklist.getpos(i).setStatus(true);
System.out.println("借阅成功");
break;
}
}
if (i == currsize) {
System.out.println("没有找到你要借阅的书籍");
}
}
}
删除图书:Deleoperation (难点)
删除书籍需要确认删除书籍的名称,再通过遍历确认要删除图书的在书架数组中的位子,通过“覆盖”的方式将书籍删除掉,注意将最后一本书重置为null
package operation;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class Deleoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("删除图书");
System.out.println("请输入你要删除的书籍");
Scanner scanner = new Scanner(System.in);
String bookname = scanner.nextLine();
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
if(bookname.equals(booklist.getpos(i).getBookname())==true){
for(int j = i; j<currsize-1; j++){
Book book = booklist.getpos(j+1);
booklist.setpos(j,book);
}
booklist.setpos(currsize,null); //最后一本书为空
booklist.setBooksize(currsize-1);
System.out.println("删除成功");
break;
}
}
if(i==currsize){
System.out.println("没有找到你要删除书籍");
}
}
}
显示图书:Displayoperation
遍历打印就行了
package operation;
import book.Booklist;
public class Displayoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("显示图书");
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
System.out.println(booklist.getpos(i));
}
}
}
查找书籍:Findoperation
通过提醒用户输入要查找书籍的名字,通过遍历书架比较书架中书籍的名称与要查找的书籍名称是否一致来实现。
package operation;
import book.Booklist;
import java.util.Scanner;
public class Findoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("查阅图书");
System.out.println("请输入你要查找书籍的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
if(name.equals(booklist.getpos(i).getBookname())==true){
System.out.println(booklist.getpos(i));
break;
}
}
if(i==currsize){
System.out.println("没有找到你要查找的书籍");
}
}
}
退出系统:Exitoperation
为了避免内存泄漏,我们将书架的数据全部销毁掉
使用System.exit(0) 正常退出程序
package operation;
import book.Book;
import book.Booklist;
public class Exitoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("退出系统");
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
booklist.setpos(i,null);
}
System.exit(0);
}
}
图书系统的全部代码:
1. Main
import User.*;
import book.Booklist;
import java.util.Scanner;
public class Main {
public static User login() {
System.out.println("这里是图书管理系统");
System.out.println("请输入你的名字:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("管理员请输入1,普通用户请输入0!");
int choice = scanner.nextInt();
if (choice == 1) {
return new Adminuser(name);
} else {
return new Normaluser(name);
}
}
public static void main(String[] args) {
Booklist booklist = new Booklist();
User user = login();
while(true){
int choice = user.meu();
user.doOperation(choice, booklist);
}
}
}
2. 文件夹:User
user类:(抽象父类)
package User;
import book.Booklist;
import operation.Ioperation;
abstract public class User {
protected String name;
public User(String name){
this.name = name;
}
public abstract int meu();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Ioperation[] ioperations;
public void doOperation(int choice,Booklist booklist) {
ioperations[choice].work(booklist);
}
}
Adminuser类:
import java.util.Scanner;
public class Adminuser extends User{
public Adminuser(String name) {
super(name);
this.ioperations = new Ioperation[] {
new Exitoperation(),
new Findoperation(),
new Addoperation(),
new Deleoperation(),
new Displayoperation()
};
}
@Override
public int meu() {
System.out.println(this.name+"管理员你好呀,欢迎来到这个图书系统哦!");
System.out.println("请选择以下选项:");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示图书");
System.out.println("0.退出系统");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
Normaluser类:
import java.util.Scanner;
public class Normaluser extends User {
public Normaluser(String name) {
super(name);
this.ioperations = new Ioperation[]{
new Exitoperation(),
new Findoperation(),
new Borrowoperation(),
new Backoperation()
};
}
@Override
public int meu() {
System.out.println(this.name + "用户你好呀,欢迎来到这个图书系统哦!");
System.out.println("请选择以下选项:");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
3. 文件夹:operation
Addoperation类:
import book.Booklist;
import java.util.Scanner;
public class Addoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("增加图书");
System.out.println("请输入你要添加书籍的名字:");
Scanner scanner = new Scanner(System.in);
String bookname = scanner.nextLine();
System.out.println("书的作者是?");
String author = scanner.nextLine();
System.out.println("书的类型是?");
String type = scanner.nextLine();
System.out.println("书的价格是?");
int price = scanner.nextInt();
Book book = new Book(bookname,author,type,price);
int currsize = booklist.getBooksize();
booklist.setpos(currsize,book);
booklist.setBooksize(currsize+1);
System.out.println("新增成功");
}
Backoperation类:
package operation;
import book.Booklist;
import java.util.Scanner;
public class Backoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("归还图书");
System.out.println("请输入你要归还书籍的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
if(name.equals(booklist.getpos(i).getBookname())==true){
booklist.getpos(i).setStatus(false);
System.out.println("归还成功");
break;
}
}
if(i==currsize){
System.out.println("没有找到你要归还的书籍");
}
}
}
Borrowoperation类
import book.Booklist;
import java.util.Scanner;
public class Borrowoperation implements Ioperation {
public void work(Booklist booklist) {
System.out.println("借阅图书");
System.out.println("请输入你要借阅书籍的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
if (name.equals(booklist.getpos(i).getBookname()) == true) {
booklist.getpos(i).setStatus(true);
System.out.println("借阅成功");
break;
}
}
if (i == currsize) {
System.out.println("没有找到你要借阅的书籍");
}
}
}
Deleoperation类
package operation;
import book.Book;
import book.Booklist;
import java.util.Scanner;
public class Deleoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("删除图书");
System.out.println("请输入你要删除的书籍");
Scanner scanner = new Scanner(System.in);
String bookname = scanner.nextLine();
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
if(bookname.equals(booklist.getpos(i).getBookname())==true){
for(int j = i; j<currsize-1; j++){
Book book = booklist.getpos(j+1);
booklist.setpos(j,book);
}
booklist.setpos(currsize,null); //最后一本书为空
booklist.setBooksize(currsize-1);
System.out.println("删除成功");
break;
}
}
if(i==currsize){
System.out.println("没有找到你要删除书籍");
}
}
}
Displayoperation类:
package operation;
import book.Booklist;
public class Displayoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("显示图书");
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
System.out.println(booklist.getpos(i));
}
}
}
Findoperation类
package operation;
import book.Booklist;
import java.util.Scanner;
public class Findoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("查阅图书");
System.out.println("请输入你要查找书籍的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
if(name.equals(booklist.getpos(i).getBookname())==true){
System.out.println(booklist.getpos(i));
break;
}
}
if(i==currsize){
System.out.println("没有找到你要查找的书籍");
}
}
}
Exitoperation类
package operation;
import book.Book;
import book.Booklist;
public class Exitoperation implements Ioperation{
public void work(Booklist booklist){
System.out.println("退出系统");
int currsize = booklist.getBooksize();
int i = 0;
for (i = 0; i < currsize; i++) {
booklist.setpos(i,null);
}
System.exit(0);
}
}
4.文件夹:book
Book类:
package book;
public class Book {
//书的信息
private String bookname;
private String author;
private String type;
private int price;
private boolean status;
public Book(String bookname, String author, String type, int price) {
this.bookname = bookname;
this.author = author;
this.type = type;
this.price = price;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
@Override
public String toString() {
return "Book{" +
"bookname='" + bookname +
", author='" + author +
", price=" + price +
((status==true)?" 已借出":" 未借出")+"}";
}
}
Booklist类:
package book;
public class Booklist {
Book[] books = new Book[10];
private int booksize = 0;
public Booklist(){
books[0] = new Book("三体","刘慈欣","科幻小说",52);
books[1] = new Book("三体Ⅱ:黑暗森林","刘慈欣","科幻小说",52);
books[2] = new Book("三体Ⅲ:死神永生","刘慈欣","科幻小说",52);
this.booksize = 3;
}
public int getBooksize() {
return booksize;
}
public void setBooksize(int booksize) {
this.booksize = booksize;
}
public Book getpos(int sz){
return books[sz];
}
public void setpos(int sz,Book book){
books[sz] = book;
}
}
运行效果:
总结:
一个初学者学习的小小项目,希望未来有机会做一个真正的项目!
与君共勉!
感谢阅读!