前言
结合前面所学的Java语法以及对类和对象的认识,我们可以简单的实现图书管理系统,这有助于我们对前面所学知识的巩固与总结
一.框架的实现
Java的核心思想是面向对象编程,这里我们要应用到项目的实现
首先对于图书管理系统,我们要先定一个大致的框架即—— 图书与用户,将这两类结合即是一个完整的图书管理系统
对于图书,我们可以分为书名,作者,单价,类型,是否借出
而对于用户,我们可以分为管理员与普通用户,他们能进行的操作也有所不同;
对于管理员,能够进行查找、新增、删除、显示、退出操作
对于普通用户,能够进行查找、借阅、归还、退出操作
二.Book包
我们通过包来进行分类管理
创建一个Book来存放与Book相关的类:Book类与BookList类
2.1Book类
这里我们创建一个Book类来存放单本书的相关信息,根据前面所学的三大特性之一的封装,我们使用private关键字来定义相关属性,之后进行初始化,构造方法,重写
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=" + isLend +
'}';
}
}
但是光是书是单本书是不够的,我们需要有书架来存放不同的书籍
2.2BookList类
在这我们定义了一个Book类的数组来存放书籍,我们在借阅的时候,书籍上的书数量,位置等会发生变化,所以我们需要来存放这些数据
假设这里已经存放了三本书,如《三国演义》《西游记》《红楼梦》......
public class BookList {
private Book[] books=new Book[10];
private int usedSize;
public BookList(){
books[0]=new Book("三国演义","罗贯中",10,"小说");
books[1]=new Book("西游记","吴承恩",12,"小说");
books[2]=new Book("红楼梦","曹雪芹",11,"小说");
this.usedSize=3;
}
public Book getBook(int pos){
return books[pos];
}
public void setBook(int pos,Book book){
books[pos]=book;
}
public int getUsedSize(){
return usedSize;
}
public void setUsedSize(int usedSize){
this.usedSize=usedSize;
}
public boolean isFull(){
if(this.usedSize==books.length){
return true;
}
return false;
}
}
三.User包
我们将用户分为管理员与普通用户,他们之间有共性——用户姓名,菜单,所以我们可以应用继承来实现
3.1User类
这里还需要写入用户对图书的操作,对于子类AdminUser与NormalUser都要用到extends关键字来继承
public abstract class User {
protected String name;
protected IOPeration[] ioPerations;
public User(String name){
this.name=name;
}
public abstract int menu();
public void doIoperations(int choice,BookList bookList){
this.ioPerations[choice].work(bookList);
}
}
3.2AdminUser类
与普通用户不同,菜单的打印也就不同,同时可以进行的操作也不同
import operation.*;
import java.util.Arrays;
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 DelOperation(),
new ShowOperation()
};
}
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 sc=new Scanner(System.in);
int choice=sc.nextInt();
return choice;
}
}
3.3NormalUser类
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.ioPerations = new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new BorrowedOperation(),
new ReturnOperation()
};
}
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("********************");
System.out.println("请输入你的操作:");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
return choice;
}
}
四.Operation包
对于Operation包,我们应当具有以下类增删、查找、借阅、归还、展示、退出,同时用一个接口来连接
4.1AddOperation类
在这里注意,我们要先判断书架是否满了,如果满了则无法添加
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration {
public void work(BookList bookList) {
System.out.println("新增图书.....");
if (bookList.isFull()) {
System.out.println("书架满了,不能新增了!");
return;
}
System.out.println("请输入你要新增的图书的书名:");
Scanner sc = new Scanner(System.in);
String bookName = 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(bookName, author, price, type);
int currentSize = bookList.getUsedSize();
bookList.setBook(currentSize, book);
bookList.setUsedSize(currentSize + 1);
System.out.println("新增图书成功!");
}
}
4.2DelOperation类
对于删除图书,我们要注意记录该本书的位置,然后在书架上进行删除
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOPeration {
public void work(BookList bookList) {
System.out.println("删除图书......");
System.out.println("请输入你要删除的图书的书名:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int currentSize = bookList.getUsedSize();
int pos = 1;
int i = 0;
for (; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {
//找到这本书 记录下标
pos = i;
break;
}
}
if (i >= currentSize) {
System.out.println("没有你要找的书!");
return;
}
for(int j=pos;i<currentSize;j++){
Book book=bookList.getBook(j+1);
bookList.setBook(j,book);
}
bookList.setUsedSize(currentSize);
bookList.setBook(currentSize-1,null);
System.out.println("删除成功");
}
}
4.3FindOperation类
我们通过遍历书架来进行查找
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOPeration{
public void work(BookList bookList){
System.out.println("查找图书......");
System.out.println("请输入你要查找图书的书名:");
Scanner sc=new Scanner(System.in);
String bookName=sc.nextLine();
int currentSize=bookList.getUsedSize();
for(int i=0;i<currentSize;i++){
Book book=bookList.getBook(i);
if(book.getName().equals(bookName)){
System.out.println("找到了这本书!");
System.out.println(book);
return;
}
}
System.out.println("没有找到你要找的书!");
}
}
4.4BorrowedOperation类与ReturnOperation类
这里我们需要先查找相关书籍,若没找到则无法借阅
import book.BookList;
import java.util.Scanner;
public class BorrowedOperation implements IOPeration{
@Override
public void work(BookList bookList){
System.out.println("借阅图书.....");
System.out.println("请输入你要借阅的图书的书名:");
Scanner sc=new Scanner(System.in);
String bookName=sc.nextLine();
int currentSize=bookList.getUsedSize();
for (int i=0;i<currentSize;i++){
Book book=bookList.getBook(i);
if(book.getName().equals(bookName)){
book.setLend(true);
System.out.println("借阅成功!");
return;
}
}
System.out.println("借阅失败!");
}
}
同样的若没有相关书籍的借出,也将无法归还成功
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 book=bookList.getBook(i);
if(book.getName().equals(bookName)){
book.setLend(false);
System.out.println("还书成功!");
return;
}
}
System.out.println("还书失败!");
}
}
4.5ShowOperation类
我们可以通过该操作来查看所有图书
import book.Book;
import book.BookList;
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 book=bookList.getBook(i);
System.out.println(book);
}
}
}
4.6ExitOperation类
这里我们需要在退出的时候将每本书置为null,避免对空间的浪费
import book.BookList;
public class ExitOperation implements IOPeration {
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
bookList.setBook(i, null);
}
System.exit(0);
}
}
4.7IOPeration接口
这里实现对各个操作的整合
import book.BookList;
public interface IOPeration {
void work(BookList bookList);
}
五.Main测试
通过输入1/0来进行不同身份的登入,然后进行相关的操作
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的身份,1:管理员 2:普通用户");
int choice = sc.nextInt();
if (choice == 1) {
AdminUser adminUser = new AdminUser(name);
return adminUser;
} else {
NormalUser normalUser = new NormalUser(name);
return normalUser;
}
}
public static void main(String[] args) {
BookList bookList=new BookList();
User user=login();
while(true){
int choice =user.menu();
user.doIoperations(choice,bookList);
}
}
}
六.最后
对于该项目,我们还可以进行更多的完善,如当书架满的时候如何进行扩容?我们是否可以设置借还天数,这些都需要我们更深入对Java的研究.因此Java学习之路任重而道远
如果上述内容对您有帮助,希望给个三连谢谢!