简易版 图书管理系统

简介: 简易版 图书管理系统

本章作为一个练习,对于前面学过的那些语法进行一个整合运用。

语法方面主要包括:封装、继承、多态、抽象类和接口。

首先,我们将整个系统分为4个包,


c23e9c6a6c9947a4bb9788a196b58ad2.png


分别是Book类用于封装书和书架的具体信息。

Main包也就是封装主类,用于对整个系统的具体操作。

Operate包用于封装具体的操作。

User包用于管理用户信息。

我们一个包一个包来讲解。

1. Book包


83a1041aeb9544bfab918537e859f504.png


Book包分为两类,分别是书和书架。

1.1 Book类

该类主要是对书的一些基本信息进行封装,并且提供Getting和Setting方法。

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.Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                //", isBorrowed=" + isBorrowed +
                (isBorrowed  ? "  已经被借出" : "  未被借出") +
                '}';
    }
}


1.2 BookList类

书架的创建:

包括了初始化,以及对一些书籍的基本操作。

package Book;
public class BookList {
    private Book[] books = new Book[10];//创建书架
    private int usedSize;//记录书架上书的数量
    public BookList() {//初始化3本书
        books[0] = new Book("我们仨","杨绛",89,"文学");
        books[1] = new Book("明朝那些事","当年明月",78,"历史");
        books[2] = new Book("红楼梦","曹雪芹",49,"小说");
        this.usedSize = 3;
    }
    public Book[] getBooks() {
        return books;
    }
    public void setBooks(int pos,Book book) {
        books[pos] = book;
    }
    public int getUsedSize() {
        return usedSize;
    }
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
    public Book getBook(int pos) {
        return this.books[pos];
    }
    //重写setBook方法作用于设置图书(增删)
    public void setBook(Book book) {
        this.books[usedSize] = book;
    }
    public void setBook(int pos,Book book) {
        this.books[pos] = book;
    }
}


2. User包


4082bfce15684579a5a88ac136342e11.png


User包被分为三类,其中User类是抽象类,用于管理人员类和普通用户类继承。

AdminUser是管理类,NormalUser类是普通用户类。

2.1 User抽象类


因为对于不同的用户而言,他们的访问权限是不同的,所以需要将菜单抽象出来以示区分。

另外就是基本信息。

package User;
import Book.BookList;
import Operate.MyOperate;
//抽象出menu()菜单方法
public abstract class User {
    //protected是访问权限,改为更大的也可以
    protected String name;
    protected MyOperate[] myOperate;//等会到Operate包再讲
    //用户信息
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
    //作用于main方法中对不同的用户进行区分
    public void doWork(int choice, BookList bookList) {
        this.myOperate[choice].work(bookList);
    }
}


2.2 AdminUser类

这里开辟的MyOperate数组是对管理人员的访问权限开辟空间,其中功能包括 退出,查找,增加,删除,显示


ab2b5c1c87b8438495c2d6a39c122154.png

package User;
import Operate.*;
import java.util.Scanner;
public class AdminUser extends User {
    //管理人员所拥有的访问权限
    public AdminUser(String name) {
        super(name);
        this.myOperate = new MyOperate[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation(),
        };
    }
    //管理人员拥有的权限
    public int menu() {
        System.out.println("*****************************************");
        System.out.println("hello"+ name +"欢迎来到图书小小练习");
        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;
    }
}

2.3  NormalUser类


这里开辟的MyOperate数组是对普通用户的访问权限开辟空间,其中功能包括 退出,查找,借书,还书


2fca07614cbe4e52b772952ff0bd9186.png

package User;
import Operate.*;
import java.util.Scanner;
public class NormalUser extends User {
    //普通用户所拥有的访问权限
    public NormalUser(String name) {
        super(name);
        this.myOperate = new MyOperate[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperate(),
                new ReturnOperation(),
        };
    }
    //普通用户拥有的权限
    @Override
    public int menu() {
        System.out.println("****************************");
        System.out.println("hello "+name+" 欢迎来到图书小练习");
        System.out.println("1.查找图书!");
        System.out.println("2.借阅图书!");
        System.out.println("3.归还图书!");
        System.out.println("0.退出系统!");
        System.out.println("****************************");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

3. Operate包


Operate的各个操作,增、删、查、借书、还书、退出。



f2385a8b2a7d4d6db920eebaca0a0c06.png


我们 Operate包 将普通用户和管理员用户的具体实现操作类全写在Operate包 中。

3.1 MyOperate接口


MyOperate接口只设计好了各个Operation规范(方法)


package Operate;
import Book.BookList;
public interface MyOperate {
    public void work(BookList bookList);
}


3.2  AddOperation类

本类用于添加书籍得基本信息,并且做了基本的判断。


package Operate;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class AddOperation implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入书名");
        String name = 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(name, author, price, type);
        //得到此时书架上书的数量
        int currentSize = bookList.getUsedSize();
        //遍历,查找是否想添加的书已经存在了
        //默认添加在最后面
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if(tmp.getName().equals(name)) {
                System.out.println("已经存在这本书了,不能再放入了!");
                return;//如果存在即退出
            }
        }
        //如果不存在即添加
        bookList.setBook(book);
        //每添加一本书下表向后移
        bookList.setUsedSize(currentSize + 1);
    }
}


3.3  DelOperation类

先上代码:

package Operate;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class DelOperation implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!");
        System.out.println("请输入你要删除图书的名字:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        //得到当前下标
        int currentSize = bookList.getUsedSize();
        int index = -1;
        //遍历,tmp.getName().equals(name)为真即表示书架存在该书
        //否则则该书不存在
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if (tmp.getName().equals(name)) {
                index = i;
                break;
            }
        }
        //图示说明
        for (int j = index; j < currentSize - 1; j++) {
            Book book = bookList.getBook(j+1);
            bookList.setBook(j,book);
        }
        bookList.setUsedSize(currentSize - 1);
        //删除对象,把最后一个设置为bull
        bookList.setBook(currentSize - 1, null);
    }
}


图示:


9fb6a72b958d44b7868e112ec251c831.png


假设currentSize 在这里,我们想要删掉该书,那么我们就将currentSize + 1 赋值给currentSize;

89ee4d7da7ea47f99831df5b7c5c2066.png


759ab276746442269a1f1d2c707da469.png


接着currentSize向后走:


f62876fa78dd4d4e9654477d6898821a.png



重复上述操作:


0b6f97b62a15490dab5deb6c92feefad.png



知道最后一个:


76b095b9ebba4c8688f4ba76f7cb9e48.png


直接将最后一个删除,毕竟每删除一个都需要将 书架上的书减少一本:

573b27cf37d149de81548d46ffe783aa.png



这样也解释了为什么之前需要重写setBook()方法。

3.4 ExitOperation

该类就只提供一个方法:exit()

import Book.BookList;
public class ExitOperation implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");
        System.exit(0);
    }
}


为什么exit()方法中的参数是0,因为我们正常退出是就是0:


492f22695b524626b6fe2ad11d6186ac.png

3.5  FindOperation类


FindOperation类实现很简单,只需要提供书名再进行遍历,当然也可以根据价格、作者进行遍历。

package Operate;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class FindOperation implements MyOperate{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
        System.out.println("请输入书名!");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        //获取当前图书在书架得下标
        int currentSize = bookList.getUsedSize();
        //遍历
        for (int i = 0; i < currentSize; i++) {
            //System.out.println(bookList[i]);
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                System.out.println("找到了这本书");
                System.out.println(book.toString());
                return;
            }
        }
        System.out.println("没有找到"+name);
    }
}


3.6 ShowOperation类

遍历获取通过Getting方法打印即可。

package Operate;
import Book.Book;
import Book.BookList;
public class ShowOperation implements MyOperate {
    @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);
        }
    }
}

以上便是管理员访问得全部权限,当然有需要还可以自己添加所需要的方法。

后面得便是普通用户特有的权限,普通用户也有FindOperation、ShowOperation。

3.7 BorrowedOperation类


方法的逻辑很简单,只需稍加注意

package Operate;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class BorrowedOperate implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
        System.out.println("请输入你要借阅的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        //获取
        int currentSize = bookList.getUsedSize();
        //遍历
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            //不仅需要判断书是否存在书架上,并且还需要判断是否已经借出
            if (book.getName().equals(name) &&
            book.isBorrowed() == false) {
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return;
            }
        }
    }
}

3.8 ReturnOperation类

逻辑于BorrowedOperation类相似

package Operate;
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class ReturnOperation implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
        System.out.println("请输入你要归还的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name) &&
                    book.isBorrowed()) {
                book.setBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
    }
}


4. Main类

Main类中只有一个类,主类,整个程序的入口。


4df24fb2a0f2439a83a249f8bacc7485.png

上代码:

package Main;
import Book.BookList;
import User.AdminUser;
import User.User;
import User.NormalUser;
import java.util.Scanner;
public class Main {
    //提供一个静态方法用于创建身份,是判断管理员还是普通用户
    public 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 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.menu();
            user.doWork(choice,bookList);
        }
    }
}



这里发生了一个向上转型:


1b636e0e72e248028c8f0fb8852ca592.png


1a7b30e3ce044d3e8fc8929a5309245c.png


主方法的内容非常简单:

1. 创建一个书架;

2.通过登录方法确认用户信息;

3.一个死循环,不停的使用“权限”,知道用户输入0退出。


里就体现了面向对象的思想,所有的过程全部封装完成,只对外提供了公开的方法。

本章的思路都非常简单,只是有些地方需要稍加注意,本章的目的便是体验面向对象的思想。

案例演示:

687694cdbc1745efa4a279be56703271.png

相关文章
|
2月前
|
C++
图书管理系统(C++)
图书管理系统(C++)
18 0
|
2月前
图书管理系统
图书管理系统
40 0
|
16天前
|
前端开发 JavaScript Java
算机Java项目|图书大厦图书管理系统的设计与实现
算机Java项目|图书大厦图书管理系统的设计与实现
|
16天前
|
存储 小程序 前端开发
java毕设项目|宿舍管理系统小程序设计与实现
java毕设项目|宿舍管理系统小程序设计与实现
|
2月前
|
Java
Java实现图书管理系统
Java实现图书管理系统
42 0
|
2月前
|
存储 Java
用Java实现图书管理系统
用Java实现图书管理系统
31 0
|
2月前
|
存储 Java
Java实现简易图书管理系统
Java实现简易图书管理系统
55 4
|
2月前
|
存储 安全 Java
图书管理系统的设计与实现
图书管理系统的设计与实现
|
11月前
|
Java
图书管理系统(Java实现简易版)
图书管理系统(Java实现简易版)
105 0
|
2月前
|
Java
图书管理系统(图文详解,附源码)
图书管理系统(图文详解,附源码)
906 0