【用java在控制台实现简单的图书管理系统】
用java在控制台实现简单的图书管理系统
> 这个简易的图书管理系统,适合javaSE基础学完,所能做的项目,让学到的知识合理运用起来!检验自己的不二选择!也希望本博客对你有所帮助。(能帮助一点点我就心满意足了)
book包
Book类
这个类是用对图书的这些属性(书名,作者,类型,价格)进行了封装。为了允许外部代码访问和修改这些属性,你提供了公共的 getter 和 setter 方法。并且此处重写了toString()方法。
package book;
import java.util.Objects;
public class Book {
private String name;
private String author;
private String type;
private int price;
private boolean isBorrowed;
public Book(String name, String author, String type, int price) {
this.name = name;
this.author = author;
this.type = type;
this.price = price;
}
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 String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
// public boolean equals(Object o) {
// if (this == o) return true;
// if (o == null || getClass() != o.getClass()) return false;
// Book book = (Book) o;
// return price == book.price && Objects.equals(name, book.name) && Objects.equals(author, book.author) && Objects.equals(type, book.type);
// }
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", type='" + type + '\'' +
", price=" + price +
", isBorrowed=" + isBorrowed +
'}';
}
}
改进:
1.看这段代码你会发现我注释掉了equals(Object o)方法,因为JVM提供的equals(Object o)方法比较的是所有成员变量,而在接下来的操作,你可以根据自己的需要重写equals(Object o)。
2.重写的toString(),因为isBorrowed只有true或false两种,所以我们在这里可以运用三目操作符((isBorrowed==true)?“已借出”:“未借出”)
BookList类
package book;
public class BookList {
public int usedSize;//有效的数据个数【实际存放书的数量】
Book[] books=new Book[10];//定义了Book类型的数组,里面可以存放10本书
public BookList() {
this.books[0] = new Book("西游记","吴承恩","小说",66);
this.books[1] = new Book("红楼梦","曹雪芹","小说",77);
this.books[2] = new Book("三国演义","罗贯中","小说",88);
this.usedSize = 3;//在创建书架时直接默认存在3本书
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book[] getBooks() {
return books;
}
public void setBooks(Book[] books) {
this.books = books;
}
}
user包
User 类
User我们这里只设定了两类人:管理员、普通用户
因为管理员和普通用户进入系统的操作,以及界面是差不多(不一样的是界面上的操作可能不同)。所以我们这里定义了抽象的User类,管理员或者普通用户在使用时只需要继承User类,重写抽象User类中的方法,这样大大减少了代码数量。
package user;
import book.BookList;
import opertion.IOperation;
public abstract class User {
String name;
IOperation[] iOperations;
public abstract int menu();
public abstract void doOpertion(int choice, BookList bookList);
public User(String name) {
this.name = name;
}
}
AdmiUser类(管理员)
继承User类,重写了User中的抽象方法,在构造函数中将iOperations数组初始化。
package user;
import book.BookList;
import opertion.*;
import java.util.Scanner;
//管理员
public class AdmiUser extends User{
public AdmiUser(String name) {
super(name);
this.iOperations=new IOperation[]{
new ExitOpertion(),//退出程序
new FindOpertion(),//查找
new AddOpertion(),//增添
new DeletOpertion(),//删除
new ShowOpertion()//显示
};
}
public int menu(){
int choice = -1;
while(true) {
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.退出系统");
System.out.println("-----------------------------");
System.out.println("请输入您的操作");
Scanner scanner = new Scanner(System.in);
choice = scanner.nextInt();
if(choice >=0 && choice <= 4){
break;
}else {
System.out.println("输入错误");
}
}
return choice;
}
public void doOpertion(int choice, BookList bookList){
this.iOperations[choice].work(bookList);
}
}
NormalUser类(管理员)
继承User类,重写了User中的抽象方法,在构造函数中将iOperations数组初始化。(和AdmiUser(管理员)初始的数组内容不同,以及重写的menu()不同)
package user;
import book.BookList;
import opertion.*;
import java.util.Scanner;
//普通用户
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOpertion(),
new FindOpertion(),
new BorrowOpertion(),
new ReturnOpertion(),
new ShowOpertion()
};
}
public int menu() {
int choice = -1;
while(true) {
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.退出系统");
System.out.println("-----------------------------");
System.out.println("请输入您的操作");
Scanner scanner = new Scanner(System.in);
choice = scanner.nextInt();
if(choice >=0 && choice <= 4){
break;
}else {
System.out.println("输入错误");
}
}
return choice;
}
public void doOpertion(int choice, BookList bookList){
this.iOperations[choice].work(bookList);
}
}
opertion包
IOperation接口
这个接口是管理员和普通用户对图书进行操作的(查找图书,增加图书,借阅图书…)
这个图书管理系统基本上都是通过书名来进行操作的
package opertion;
import book.BookList;
//定义一个接口来对图书进行操作
public interface IOperation {
void work(BookList bookList);
}
FindOpertion(查找图书)
package opertion;
import book.Book;
import book.BookList;
import java.util.Scanner;
//这里是通过书名进行找书
public class FindOpertion implements IOperation {
@Override
public void work(BookList bookList) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要查找的书名");
String name = sc.nextLine();
// System.out.println("请输入你要查找的作者");
// String author = sc.nextLine();
// System.out.println("请输入你要查找书的类型");
// String type = sc.nextLine();
// System.out.println("请输入你要查找书的价格");
// int price = sc.nextInt();
// Book book = new Book(name, author, type, price);
for (int i = 0; i < bookList.getUsedSize(); i++) {
if (bookList.getBooks()[i].getName().equals(name)) {
System.out.println(bookList.getBooks()[i].toString());
return;
}
}
System.out.println("没有该书");
}
}
一般情况下,都是通过书名来进行查找图书的。对于真正的图书管理系统,肯定不止光书名来进行查找,所以这里有两种改进方式:
1.if (bookList.getBooks()[i].getName().equals(name))将name改成其他的(author)。
2.可以重写equals(Object o)你想通过啥判断就重写方法中通过啥比较。
AddOpertion(增加图书)
增加图书需要先在图书中查找看是否有这个本书,没有就添加,并将sedSize加1.
package opertion;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOpertion implements IOperation {
@Override
public void work(BookList bookList) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入要增加的书名");
String name=sc.nextLine();
System.out.println("请输入你要增加书的作者");
String author=sc.nextLine();
System.out.println("请输入你要增加书的类型");
String type=sc.nextLine();
System.out.println("请输入你要增加书的价格");
int price=sc.nextInt();
Book book=new Book(name,author,type,price);
for (int i = 0; i < bookList.getUsedSize(); i++) {
if (bookList.getBooks()[i].equals(book)){
System.out.println("有该书,无需添加");
return;
}
}
bookList.getBooks()[bookList.getUsedSize()]=book;
bookList.setUsedSize(bookList.getUsedSize()+1);
System.out.println("添加成功");
}
}
DeletOpertion(删除图书)
删除图书需要用到数组的覆盖,就是你需要定义一个变量,这个变量是来标记你要删除书的位置(数组下表)(没有则没有这本书)。特别注意的是:for (int i = flag; i < bookList.getUsedSize() - 1; i++) ,这里必须是bookList.getUsedSize() - 1,不-1, bookList.getBooks()[i] = bookList.getBooks()[i + 1];会抛出异常(数组溢出)。
package opertion;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DeletOpertion implements IOperation {
@Override
public void work(BookList bookList) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的书名");
String name = sc.nextLine();
int flag = -1;
for (int i = 0; i < bookList.getUsedSize(); i++) {
if (bookList.getBooks()[i].getName().equals(name)) {
flag = i;
}
}
if (flag != -1) {
for (int i = flag; i < bookList.getUsedSize() - 1; i++) {
bookList.getBooks()[i] = bookList.getBooks()[i + 1];
}
bookList.setUsedSize(bookList.getUsedSize() - 1);
System.out.println("删除成功");
} else {
System.out.println("没有该书");
}
}
}
BorrowOpertion(借阅图书)
借阅图书这里也是通过书名(通例)来借阅,这里需要判断书名和未被借出两个共同满足,才可以借阅成功!
package opertion;
import book.Book;
import book.BookList;
import java.util.Scanner;
//这里是通过书名来进行借阅图书的
public class BorrowOpertion implements IOperation{
@Override
public void work(BookList bookList) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入要借阅的书名");
String name=sc.nextLine();
// System.out.println("请输入你要借阅书的作者");
// String author=sc.nextLine();
// System.out.println("请输入你要借阅书的类型");
// String type=sc.nextLine();
// System.out.println("请输入你要借阅书的价格");
// int price=sc.nextInt();
// Book book=new Book(name,author,type,price);
for (int i = 0; i < bookList.getUsedSize(); i++) {
if(bookList.getBooks()[i].getName().equals(name)&& bookList.getBooks()[i].isBorrowed()!=true){
bookList.getBooks()[i].setBorrowed(true);
System.out.println("借书成功");
return;
}else if(bookList.getBooks()[i].getName().equals(name)&& bookList.getBooks()[i].isBorrowed()==true){
System.out.println("该书被借出");
return;
}
}
System.out.println("没有该书");
}
}
ReturnOpertion (归还图书)
归还图书我这里设置的是你需要知道图书的所有信息才可以归还,并且也需要满足已经借出两个条件才可以还书成功!
package opertion;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOpertion implements IOperation{
@Override
public void work(BookList bookList) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入要归还的书名");
String name=sc.nextLine();
System.out.println("请输入你要归还书的作者");
String author=sc.nextLine();
System.out.println("请输入你要归还书的类型");
String type=sc.nextLine();
System.out.println("请输入你要归还书的价格");
int price=sc.nextInt();
Book book=new Book(name,author,type,price);
for (int i = 0; i < bookList.getUsedSize(); i++) {
if (bookList.getBooks()[i].equals(book)&&bookList.getBooks()[i].isBorrowed()==true){
bookList.getBooks()[i].setBorrowed(false);
System.out.println("归还成功");
return;
}else if(bookList.getBooks()[i].equals(book)&&bookList.getBooks()[i].isBorrowed()!=true){
System.out.println("该书未被借出");
}
}
System.out.println("没有该书");
}
}
特别注意这段代码:Book book=new Book(name,author,type,price);这行代码是在创建一个新的 Book 类型的对象,并将其赋值给变量 book
ShowOpertion(展示图书)
这里就比较简单,就是简单一个数组的遍历,重写的toString()方法
package opertion;
import book.BookList;
public class ShowOpertion implements IOperation{
@Override
public void work(BookList bookList) {
for (int i = 0; i < bookList.getUsedSize(); i++) {
System.out.println(bookList.getBooks()[i].toString());
}
}
}
ExitOpertion(退出程序)
package opertion;
import book.BookList;
public class ExitOpertion implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出成功");
System.exit(0);
}
}
Main(执行程序)
定义一个静态方法,返回值类型进行了向上转型
import book.BookList;
import user.AdmiUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
private static User login(){
System.out.println("请输入你的姓名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入你的身份:1.管理员;2.普通用户");
int choice = scanner.nextInt();
if(choice == 1){
return new AdmiUser(name);//创建一个 AdmiUser 类的实例,并使用传入的 name 参数来初始化这个实例。
} else if (choice == 2) {
return new NormalUser(name);
}else {
System.out.println("输入错误");
return null;
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user = login();
while (true){
int choice = user.menu();
user.doOpertion(choice,bookList);
}
}
}