图书管理系统
图书管理系统
在初步学习过JavaSE的相关知识之后我们就可以将学过的知识利用起来,因此可以做一个图书管理系统的小练习。
结果图:
1.登录
首先需要一个登陆界面来区分我们的身份是管理员还是普通用户;
//登录选择
public static User login() {System.out.println("请输入你的姓名:");Scanner sc = new Scanner(System.in);String username = sc.nextLine();System.out.println("欢迎"+username+"来到图书管理系统");System.out.println("请输入你的身份:1.管理员 2.普通用户");int choice = sc.nextInt();if (1 == choice) {return new AdminUser(username);} else if(2 == choice){return new NormalUser(username);}return null;
}
2.使用者不同造成功能不同
该系统主要分为两个部分,普通用户菜单和管理员菜单,这是两个不同的面板,因此我们需要创建普通用户类和管理员类,但是为了方便管理,可以将这两个不同的类都继承同一个User类便于管理和操作;
package user;
import Operation.*;
import java.util.Scanner;
/*** 管理员面板*/
public class AdminUser extends User {public AdminUser(String name) {super(name);//创建管理员所需要的操作的数组面板this.iOperations =new IOperation[]{new ExitBook(),new FindBook(),new AddBook(),new DelBook(),new ShowBook(),};}@Overridepublic int menu() {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("请输入你的操作:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}
package user;
import Book.BookList;
import Operation.*;public abstract class User {public String name;//创建数组但是不需要初始化,这是因为需要不同的类创建不同的对象IOperation[] iOperations;public User(String name) {this.name = name;}public abstract int menu();//使用具体的操作方法public void doOperations(int choice, BookList bookList) {//创建一个对象IOperation iOperation = this.iOperations[choice];iOperation.work(bookList);}
}
import Operation.*;import java.util.Scanner;/*** 普通用户面板*/
public class NormalUser extends User {public NormalUser(String name) {super(name);//这里体现出了多态的特点this.iOperations = new IOperation[]{new ExitBook(),new FindBook(),new BorrowBook(),new ReturnBook(),new ShowBook(),};}@Overridepublic int menu() {System.out.println("欢迎来到用户界面");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("请输入你的操作:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}
在User类中就可以创建一个操作类的数组,但是User类无需实例化,因此它就可以是一个抽象类。
注:这里User之所以能够接收login的返回值是由于向上转型,它本质上还是子类。
3.管理类方法(增删查改等功能)
之后我们还需要针对不同的身份设计不同的管理图书的方法,这些可以创建一些不同的类,而这些类为了便于管理也可以实现同一个操作类接口,这样就能够将这些类放在同一个数组中;
4.图书和书架
而图书管理系统最主要的对象就是图书了,我们还可以用一个书架来存放图书,这个书架主要实现的功能就是存放和取出图书,而图书主要包括书名、作者、价格、类型以及是否被借出五个属性,这些属性构成了一本书。
package Book;/*** 书架*/
public class BookList {private Book[] books;private int usedSize;private int defaultSize = 3;public BookList() {books = new Book[defaultSize];this.books[0] = new Book("三国演义","罗贯中",18,"历史类");this.books[1] = new Book("水浒传","施耐庵",32,"武侠");this.books[2] = new Book("红楼梦","曹雪芹",24,"恋爱");usedSize = 3;}public int getDefaultSize() {return defaultSize;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public void setBooks(int count, Book books) {this.books[count] = books;this.usedSize++;}public Book[] getBooks() {return books;}public void setBooksSpace(int newDefaultSize,Book[] books){this.books = books;this.defaultSize = newDefaultSize;}}
package Book;
/**** 书籍*/
public class Book {private String name;private String author;private int price;private String type;private Boolean isBorrowed = false;public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}public String getName() {return name;}public Boolean getIsBorrow() {return isBorrowed;}public void setBorrowed(Boolean borrowed) {this.isBorrowed = borrowed;}// 打印书籍@Overridepublic String toString() {if(this.isBorrowed){return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +",已借出}";}else {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +",未借出}";}}
}
5.具体实现
5.1添加图书
package Operation;
import Book.Book;
import Book.BookList;import java.util.Arrays;
import java.util.Scanner;//增加图书
public class AddBook implements IOperation{@Overridepublic void work(BookList bookList) {//添加书籍之前需要检查书架是否为满Boolean isFulled = isFull(bookList);if(isFulled){Book[] books = Arrays.copyOf(bookList.getBooks(), bookList.getDefaultSize()*2);bookList.setBooksSpace(bookList.getDefaultSize()*2,books);}Scanner sc = new Scanner(System.in);int count = bookList.getUsedSize();System.out.println("添加图书...");System.out.println("请输入你要添加书籍的名字:");String name = sc.nextLine();for(int i = 0; i < count; i++){if(bookList.getBooks()[i].getName().equals(name)){System.out.println("已经有这本书了,不能重复添加!!!");return;}}System.out.println("请输入你要添加书籍的作者:");String author = sc.nextLine();System.out.println("请输入你要添加书籍的价格:");int price = sc.nextInt();System.out.println("请输入你要添加书籍的类型:");sc.nextLine();String type = sc.nextLine();bookList.setBooks(count,new Book(name, author, price, type));System.out.println("添加完成!");bookList.setUsedSize(count + 1);System.out.println(bookList.getBooks()[count].toString());}//判断书架中的书是否满员public static boolean isFull(BookList bookList){if(bookList.getUsedSize() >= bookList.getDefaultSize()){return true;}else {return false;}}
}
注:添加图书时需要注意书架的容量是否充足,如果不充足还需要扩容,可以使用Arrays.copyof来扩容;
Arrays.copyOf扩容时是将数组对象复制下来创建一个新的数组,因此需要将其传回给原来的Book数组。
5.2删除图书
package Operation;import Book.BookList;
import Book.Book;import java.util.Scanner;public class DelBook implements IOperation {@Overridepublic void work(BookList bookList) {assert bookList.getBooks()[0] != null;System.out.println("删除图书.....");Scanner sc = new Scanner(System.in);int count = bookList.getUsedSize();System.out.println("请输入你要删除书籍的名字:");String name = sc.nextLine();for (int i = 0; i < count; i++) {//寻找书是否存在if (bookList.getBooks()[i].getName().equals(name)) {bookList.getBooks()[i] = null;for (int j = i; j < count - 1; j++) {Book book = bookList.getBooks()[j + 1];bookList.setBooks(j, book);}bookList.setBooks(count - 1, null);bookList.setUsedSize(count - 1);System.out.println("删除成功!!!");return;}}System.out.println("未找到这本书,无法删除!!!");}
}
5.3查找图书
package Operation;import Book.BookList;import java.util.Scanner;//查找图书
public class FindBook implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查找图书....");Scanner sc = new Scanner(System.in);int count = bookList.getUsedSize();System.out.println("请输入你要查找书籍的名字:");String name = sc.nextLine();for(int i = 0; i < count; i++){if(bookList.getBooks()[i].getName().equals(name)){System.out.println("查找成功:");System.out.println(bookList.getBooks()[i].toString());return;}}System.out.println("没找到这本书!");}
}
5.4展示图书
package Operation;import Book.BookList;//展示图书
public class ShowBook implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("展示图书信息....");int count = bookList.getUsedSize();for (int i = 0; i < count; i++) {System.out.println(bookList.getBooks()[i].toString());}}
}
5.5归还图书
package Operation;import Book.BookList;import java.util.Scanner;//归还书籍
public class ReturnBook implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书.....");Scanner sc = new Scanner(System.in);System.out.println("请输入你要归还的图书的名字:");String bookName = sc.nextLine();int count = bookList.getUsedSize();for (int i = 0; i < count; i++) {if(bookList.getBooks()[i].getName().equals(bookName)){if(bookList.getBooks()[i].getIsBorrow()){bookList.getBooks()[i].setBorrowed(false);System.out.println("还书成功。");return;}else {System.out.println("该书已经被归还,无需归还!!!");return;}}}System.out.println("未找到"+bookName+"这本书,无法归还!!!");}
}
5.6退出系统
package Operation;
/*** 退出图书系统*/import Book.BookList;public class ExitBook implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统....");int count = bookList.getUsedSize();if(bookList.getBooks() != null){for (int i = count - 1; i >= 0; i--) {bookList.setBooks(i, null);}}System.exit(0);}
}
5.7借阅图书
package Operation;import Book.BookList;import java.util.Scanner;//借阅图书
public class BorrowBook implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("借出图书.....");Scanner sc = new Scanner(System.in);System.out.println("请输入你要借出的图书的名字:");String bookName = sc.nextLine();int count = bookList.getUsedSize();for (int i = 0; i < count; i++) {if(bookList.getBooks()[i].getName().equals(bookName)){if(!bookList.getBooks()[i].getIsBorrow()){bookList.getBooks()[i].setBorrowed(true);System.out.println("借书成功。");return;}else {System.out.println("该书已经被借出,无法借出!!!");return;}}}System.out.println("没有找到该书,无法借阅!!");}
}
6.书籍统一管理
package Operation;import Book.BookList;//书籍统一操作
public interface IOperation {//动态绑定实现具体操作public void work(BookList bookList);
}
这里是一个接口,无需实现,其最主要的作用就是统一管理操作书架的方法。
7.测试
import Book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Test {//登录选择public static User login() {System.out.println("请输入你的姓名:");Scanner sc = new Scanner(System.in);String username = sc.nextLine();System.out.println("欢迎"+username+"来到图书管理系统");System.out.println("请输入你的身份:1.管理员 2.普通用户");int choice = sc.nextInt();if (1 == choice) {return new AdminUser(username);} else if(2 == choice){return new NormalUser(username);}return null;}public static void main(String[] args) {BookList bookList = new BookList();//返回操作图书系统的对象User user = login();while(true){//返回选择的操作int choice =user.menu();user.doOperations(choice,bookList);}}
}
8.总结
总的来说,图书管理系统涉及到的知识有类和对象的基础知识,数组、变量等,封装、继承和多态,动态绑定和方法重写,接口的实现和抽象类的继承;而其难点主要在于图书管理系统架构的搭建,总体框架搭好以后其中的内容倒不是很难。