目录
今天我们要对之前学习的知识进行一个总体的使用,想必大家都借过学校的书籍吧,当我们进行图书的借阅和归还的时候,我们肯定会使用一个系统进行,而今天我们就要利用学过的知识写一个简单的图书管理系统。
一.菜单
首先我们知道要使用图书管理系统我们肯定需要有个菜单才能进操作,而菜单又不能有一个,管理系统肯定是需要一个管理员进行图书的增删功能和学生的借阅归还功能的,所以我们要有两个菜单:管理员菜单和普通学生的菜单。
当然不同的菜单肯定有不同的功能,我们先来看一下这两个菜单的功能吧!
管理员:
学生:
看到了这个界面这后其实我们能够发现根据我们不同的选择会出现不同的菜单和功能,这就要使用到我们的多态了。
二.图书管理
1.书籍类:
既然我们是一个图书管理,我们肯定是要创建一个书籍类来存放书籍的各种属性。
除此之外我们还要去重写我们的toString()方法
但是这里还是有一些问题,就是关于我们的是否将书借出,如果我们根据重写方法打印,我们发现因为我们的isBorrowed是boolean类型,我们得到的值是false和true,并不是我们的是否借出,所以我们还要去修改一下这里
我们可以利用三目运算符,为true时是被借出,fales时是未被借出 。这是因为初始时boolean类型成员变量的值为false。
2.书架类
我们虽然已经得到了书的各种属性,但是对于书的存储我们还需要建立一个书架类。
对于书架来说我们肯定是有着一定的容量的,所以我们可以创建一个数组,并设置一下最大的容量。因为是用来存储书籍的,所以我们创建的数组的类型为书类
设置完容量之后,我们可以预先在书架上放上几本书,同时有了书之后,我们的数组的有效值就不一定是我们设置的最大容量,而是我们书的当前个数,所以我们可以在设置一个有效的成员变量,根据我们书的个数进行有效值的赋值。
三.用户管理
1.用户类
就用户来说我们有两个用户,他们之间都有着一定的共性,所以我们要创建一个父类,让子类继承父类,实现共性的抽取,但是我们知道不同的子类菜单的实现方式是不知道的,所以我们要把我们的父类设置为抽象类,同时菜单设置为抽象方法。
2.管理员用户
在管理员中创建管理员菜单:
3.普通用户
在普通用户中创建学生菜单:
四.主程序
在我们调用菜单之前,我们还应进行我们的身份选择,才能调用对应的菜单,所以我们应设立一个方法,进行身份的选择。
当我们进行完身份的选择之后我们又该如何去调用我们身份所对应的菜单呢?这是我们就要利用到我们所学的多态来进行解决,我们通过向上转型实现多态,再根据动态绑定,通过父类的引用去实现子类的方法,这样就成功的解决了使用对应菜单的问题
最后我们也成功的根据不同的选择得出来不同得菜单
五.操作管理
根据我们的菜单我们可以了解到,我们需要实现多个操作方法去实现图书得管理,所以我们要去创建不同得操作类
在这些类中,我们发现我们创建了一个操作接口,我们可以让我们不同的操作类去实现这个接口中得方法,同时将这些不同的类进行统一。
现在我们已经将操作方法都建立完成了,那么我们该如何通过菜单去调用这些方法呢?
我们先可以在用户类中创建一个未初始化的接口类型数组,同时我们在对应的管理员子类和普通成员子类中去进行数组的初始化,初始化的内容为子类用户所对应的操作类方法。
注意:我们定义的退出系统的序号为0,所以我们要将我们的退出系统放在第一位。
同时我们又引出了这个问题怎么去调用这些方法呢?这时,我们就又要在父类中创建一个操作方法,让这个方法通过我们所选择的序号去调用对应子类中数组的内容,这就又一次使用了我们的多态.
当然我们不可能只执行一次就结束,我们结束的准是由我们创建的"退出系统"类来决定的,所以注意我们要在菜单的调用和操作的调用上添加一个循环。
既然提到了退出系统我们肯定是要对他进行实现和使用的,下面我们就来看一看吧
1.退出系统
退出系统的方式其实非常的简单,我们只需要去写下面这段代码就可以了。
但是我们发现我们并没使用到我们传过来的书架,那么我们为什么要传他呢,我们可以想一想,我们的每个书籍都是一个对象,在我们退出系统之前,我们应该将他们都回收掉防止我们的内存泄露,那么我们该怎么回收呢,其实我们知道只要我们不引用这个对象就可以将他进行回收,所以我们只需要遍历这个数组将他置空即可
同时我们将所以元素置空后,我们的书籍有效个数也应该设置为0 .
2.显示图书
最后我们剩下了我们的显示所有的图书,这就很简单了,只有我们进行数组的遍历,每得到一个就打印一个
3.增加图书
在新增图书之前我们有两个方面需要去考虑:
一.我们的书架满没满,如果满了就不能增加图书。
二.我们想要新增的图书,书架上是否已经存在,如果存在就不能增加。
方面一:
首先我们要在增加图书的类中去设立一个方法判断书架是否满了。
如果满了就会返回true,并提醒我们书架已满
方面二:
对这本书是否存在,我们只需去遍历数组,在数组中查看是否存在于我们输入姓名相同的书籍如果存在,就不用添加了。
最后如果这两个方面都没有问题,我们就可输入图书的其他信息,并将图书放入到书架当中
使用:
验证:
4.删除图书
既然有了增加那我们之后肯定是删除,在我们进行代码的编写之前,我们先来了解一下我们是如何删除的
当在我们删除书之前我们还要找书架里是否有这本书,如果有才能进行删除
使用:
验证:
5.查找图书
查找图书其实在之前的代码中我们已经写过了就是,根据他的名字来遍历数组,找到名字相同的就打印这本书的内容
6.借阅图书
对于借阅图书我们也要有两个方面来考虑:
一.是否有这本书
二.这本书是否被借出,被借出了就无法再借阅
方面一:
还是去遍历数组,匹配名字
方面二:
我们要在有这本书的前提下去进行是否被借出的判断,这时我们就可以利用到我们isBorrowed成员变量,去得到他值进行判断,如果为true就是书已经被借出了,如果为false就是没被借出可以借阅
7.归还图书
借阅完书之后肯定就是我们的归还图书了,归还图书的方式和借阅的方式是一样的,我们还是要去查找这本书如果存在并且没有被借出,就不用归还,如果被借出就归还图书
好了现在我们已经把我们所有的内容都成的实现了,最后让我们奉上完整的代码吧
六.总代码
1.总控台
import Book.BookList;
import User.AdminUser;
import User.NormalUser;
import User.User;
import java.util.Scanner;
public class Main {
public static User login(){
Scanner scan = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = scan.next();
System.out.println("请输入你的选择:1.管理员 2.学生");
int choice = scan.nextInt();
if(choice == 1){
return new AdminUser(name);
}else{
return new NormalUser(name);
}
}
public static void main(String[] args) {
User user = login();
BookList bookList = new BookList();
while (true) {
int choice = user.menu();
user.doOperations(choice, bookList);
}
}
}
2.书包
⨀书类
package Book;
public class Book {
private String name;
private String author;
private int price;
private String type;
private boolean isBorrowed;
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 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 isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", "+ (isBorrowed?"被借出" :"未被借出")+
'}';
}
}
⨀书架类
package Book;
public class BookList {
private Book[] books;
private static final int DEFAULT_SIZE = 10;
private int usedSize;
public BookList(){
this.books = new Book[DEFAULT_SIZE];
this.books[0] = new Book("三国演义","罗贯中",50,"小说");
this.books[1] = new Book("西游记","吴承恩",60,"小说");
this.books[2] = new Book("水浒传","施耐庵",55,"小说");
this.books[3] = new Book("红楼梦","曹雪芹",65,"小说");
this.usedSize = 4;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book getBook(int pos){
return books[pos];
}
public Book[] getBooks() {
return books;
}
public void setBooks(int pos,Book book){
books[pos] = book;
}
}
3.用户包
⨀用户类
package User;
import Book.BookList;
import Operation.IOPeration;
import java.util.Scanner;
public abstract class User {
public String name;
public IOPeration[] ioPerations;
Scanner scan = new Scanner(System.in);
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);
}
}
⨀普通用户类
package User;
import Operation.*;
public class NormalUser extends User {
public NormalUser(String name) {
super(name);
this.ioPerations = new IOPeration[]{
new ExitBook(),
new FindBook(),
new BorrowedBook(),
new ReturnBook(),
};
}
@Override
public 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("0.退出系统");
System.out.println("--------------------------");
System.out.print("请输入你的选择:");
int choice = scan.nextInt();
return choice;
}
}
⨀管理员类
package User;
import Operation.*;
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()
};
}
@Override
public 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("--------------------------");
System.out.print("请输入你的选择:");
int choice = scan.nextInt();
return choice;
}
}
4.操作包
1.退出系统
package Operation;
import Book.Book;
import Book.BookList;
public class ExitBook implements IOPeration{
@Override
public void work(BookList bookList){
System.out.println("退出系统");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
bookList.setBooks(i,null);
}
bookList.setUsedSize(0);
System.exit(0);
}
}
2.显示图书
package Operation;
import Book.Book;
import Book.BookList;
public class ShowBook implements IOPeration{
@Override
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);
}
}
}
3.增加图书
package Operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class AddBook implements IOPeration{
@Override
public void work(BookList bookList) {
Scanner scan = new Scanner(System.in);
System.out.println("增加图书");
System.out.println("请输入你要增加图书的姓名:");
String name = scan.next();
if(full(bookList)){
System.out.println("书架满了,放不了书了");
return;
}
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {
System.out.println("这本书已经存在,不用新增");
return;
}
}
System.out.println("请输入这本书的作者:");
String author = scan.next();
System.out.println("请输入这本书的价格:");
int price = scan.nextInt();
System.out.println("请输入这本书的类型:");
String type = scan.next();
Book book1=new Book(name, author, price, type);
bookList.setBooks(currentSize, book1);
bookList.setUsedSize(currentSize+1);
System.out.println("添加成功");
System.out.println(book1);
}
public boolean full(BookList bookList){
return bookList.getUsedSize()== bookList.getBooks().length;
}
}
4.删除图书
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class DelBook implements IOPeration {
@Override
public void work(BookList bookList){
Scanner scan = new Scanner(System.in);
System.out.println("删除图书");
System.out.println("请输入你要删除图书的姓名:");
String name = scan.next();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(name)) {
System.out.println("找到了这本书");
for (int j = i; j < currentSize - 1; j++) {
Book book1 = bookList.getBook(j+1);
bookList.setBooks(j,book1);
}
bookList.setBooks(currentSize-1,null);
bookList.setUsedSize(currentSize-1);
System.out.println("成功删除了这本书");
return;
}
}
System.out.println("没有这本书");
}
}
5.查找图书
package Operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class FindBook implements IOPeration{
@Override
public void work(BookList bookList){
Scanner scan = new Scanner(System.in);
System.out.println("查找图书");
System.out.println("请输入你要查找图书的姓名:");
String name = scan.next();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
System.out.println("找到这本书了,内容如下");
System.out.println(book);
return;
}
}
System.out.println("没有找到你要查找的这本书");
}
}
6.借阅图书
package Operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class BorrowedBook implements IOPeration{
@Override
public void work(BookList bookList){
Scanner scan = new Scanner(System.in);
System.out.println("借阅图书");
System.out.println("请输入你要借阅图书的姓名:");
String name = scan.next();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {
System.out.println("找到了这本书");
if(book.isBorrowed()){
System.out.println("这本书已经被借阅,无法再借出");
}else{
book.setBorrowed(true);
System.out.println("借阅成功");
return;
}
}
}
System.out.println("没有在书架上找到这本书,无法借阅");
}
}
7.归还图书
package Operation;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class ReturnBook implements IOPeration{
@Override
public void work(BookList bookList){
Scanner scan = new Scanner(System.in);
System.out.println("归还图书");
System.out.println("请输入你要归还图书的姓名:");
String name = scan.next();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {
System.out.println("找到了这本书");
if (!book.isBorrowed()) {
System.out.println("这本书没有被借出,不用归还");
} else {
book.setBorrowed(false);
System.out.println("归还成功");
System.out.println(book);
return;
}
}
}
System.out.println("书架上并不存在这本书,无法归还");
}
}
8.操作接口
package Operation;
import Book.BookList;
public interface IOPeration {
void work(BookList bookList);
}
好了这就是我们的全部代码,看完这个代码实现之后是不是对我们的知识理解更加的扎实了。最后希望大家能够获得收获,我们下一篇见!