当前位置:   article > 正文

图书管理系统的简单设计_图书管理系统怎么做

图书管理系统怎么做

目录

1. 图书 --- 包

1.1 图书 --- Book

1.2 书单 --- BookList

2. 操作 --- 包

3. 用户 --- 包

4. Main 类

5.  完善操作包

6.总体实现

 Java是一门面向对象的语言,那我们在通过Java设计图书管理系统的时候,可以按照一下顺序来进行编程:

   找对对象

   创建对象

   使用对象

关于构建图书管理系统,首先你得弄清楚一共有哪几个部分:图书,用户,操作。

对于这几个部分你可以分别创建对应的包来进行存储,有利于类的管理。

1. 图书 --- 包

     图书管理系统首先要有图书,书单,那我们先创建一个包用来存储图书类和书单类:

1.1 图书 --- Book

     关于图书有这几项属性:书名,作者,价格,类型,是否借出;所以在Book这个类中先定义这几项成员变量

     定义完成员变量之后,由于我们所定义的成员变量均是被 private 所修饰的,所以我们还需要定义对应的 get 和 set 方法 以及构造方法,这个可以直接根据IDEA的 Generate 快捷方法直接构建(方法如下)

     构建完这些 get 和 set 方法后重载一个 toString 方法 ------ 打印数组

     此时,我们的 Book 类就构建得差不多了:

  1. package Book;
  2. public class Book {
  3. private String name;
  4. private String author;
  5. private double price;
  6. private String type;
  7. private boolean isBorrowed=false;
  8. public Book(String name, String author, double price, String type) {
  9. this.name = name;
  10. this.author = author;
  11. this.price = price;
  12. this.type = type;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public String getAuthor() {
  21. return author;
  22. }
  23. public void setAuthor(String author) {
  24. this.author = author;
  25. }
  26. public double getPrice() {
  27. return price;
  28. }
  29. public void setPrice(double price) {
  30. this.price = price;
  31. }
  32. public String getType() {
  33. return type;
  34. }
  35. public void setType(String type) {
  36. this.type = type;
  37. }
  38. public boolean isBorrowed() {
  39. return isBorrowed;
  40. }
  41. public void setBorrowed(boolean borrowed) {
  42. isBorrowed = borrowed;
  43. }
  44. @Override
  45. public String toString() {
  46. return "Book{" +
  47. "name='" + name + '\'' +
  48. ", author='" + author + '\'' +
  49. ", price=" + price +
  50. ", type='" + type + '\'' +
  51. ", " + ((isBorrowed==false)?"未被借出":"已经借出" )+
  52. '}';
  53. }
  54. }
1.2 书单 --- BookList

      构建完图书类之后,我们就要开始构建书单用来存储书籍:

      首先,构建一个存储图书的数组 -- Book[ ]  以及 书架使用情况 --- usedSize

构建完成员变量之后,就可以定义一些方法来实现 BookList 书架的功能:

    1. 构造方法:创建一个把构造方法 ,对成员变量进行初始化。

     2.成员方法:可以参考上面书类创建的 get 和 set 方法来创建对 usedSize 的get、set方法;由于 BookList 中存在一个 private 修饰的 Book[ ] books(类似于数组),所以我们可以创建 get 方法来得到 pos 位置的书,以及创建 set 方法在 pos 位置设置一本书籍.

    按照以上步骤,便可创建一个较为简单的书架 BookList 类,整体代码如下:

  1. package Book;
  2. public class BookList {
  3. private Book[] books;
  4. private int usedSize;
  5. public BookList(){
  6. this.books=new Book[10];
  7. books[0]=new Book("三国演义","罗贯中",19.9,"小说");
  8. books[1]=new Book("西游记","吴承恩",29.9,"小说");
  9. books[2]=new Book("红楼梦","曹雪芹",39.9,"小说");
  10. usedSize=3;
  11. }
  12. public Book getBooks(int pos){
  13. return books[pos];
  14. }
  15. public void setBooks(int pos,Book book){
  16. books[pos]=book;
  17. }
  18. public int getUsedSize() {
  19. return usedSize;
  20. }
  21. public void setUsedSize(int usedSize) {
  22. this.usedSize = usedSize;
  23. }
  24. }

2. 操作 --- 包

     图书管理系统共有这些操作:查找图书、借阅图书、归还图书、显示图书、增加图书、删除图书、退出系统 。                                                                                                             

    此时,我们可以建立一个 Operate 的包将这些操作存储进去。

   在这些操作里面先写一个 work 方法 ,用来等会进行测试。由于这些操作都是对书架里面的书进行的,我们可以对work 传一个 BookList booklist 的 参数,方便后续操作。

   这里可以直接设置一个 IO 接口,方便后续类继承拓展。

接口设置完成之后,可以先简单的完善一下这写操作类,就比如下面的 Find 类:

此时我们对操作进行了简单的编写,具体详细的功能可以等后面在写。

3. 用户 --- 包

    在用户这个包里面,可以先创建一个 User 的类,而 User 又分为管理员(AdmiUser)和普通用户(NomlUser),所以可以 将 User 设置成抽象类,然后分别创建一个 AdmiUser 类 和 NomlUser 类 继承 User 这个抽象类,分别用来存储 管理员操作和普通用户操作。

   在 User 这个抽象类中,我们可以先设置用户名字 name ,在设置一个IO的数组 IO[ ] ios 用来存储不同用户的操作。

   User 这个抽象类中,我们先重载一个构造方法,其次由于用户权限不同,我们所得到的菜单可能也不同,因此,我们可以在 User 类中定义一个抽象方法 menu ,再在子类中进行重写来实现不同的菜单。

User 这个类差不多编写完成了,现在来编写他的子类 AdmiUser 类 和 NomlUser类。

    先来完善 AdmiUser 类

    1. 父类重写了构造方法,子类也要重写

    2. 父类中存在抽象方法,子类要重写,在 AdmiUser 这个管理员类中,可供管理员选择的菜单操作有这些: 1.查询书籍   2.新增书籍  3.删除书籍  4.显示图书  0.退出系统 ,我们要把他们打印在屏幕上,当然我们还要存储用户的选项:

   3. 父类 User 定义了一个 IO 的数组用来存储不同的操作所以在构造方法中,我们也可以对 IO 数组进行初始化(我们可以按照菜单中的操作将其对应的方法对应起来,比如:用户选0时,IO数组中下标为0时,刚好是Exit()操作):

 综上AdmiUser 类的整体代码如下:

  1. package User;
  2. import Book.BookList;
  3. import Operate.*;
  4. import User.*;
  5. import java.util.Scanner;
  6. public class AdmiUser extends User{
  7. public AdmiUser(String name) {
  8. super(name);
  9. this.ios=new IO[]{
  10. new Exit(),
  11. new Find(),
  12. new Add(),
  13. new Delete(),
  14. new Show()};
  15. }
  16. @Override
  17. public int menu(){
  18. System.out.println("欢迎来到管理员菜单:");
  19. System.out.println("1.查询书籍");
  20. System.out.println("2.新增书籍");
  21. System.out.println("3.删除书籍");
  22. System.out.println("4.显示图书");
  23. System.out.println("0.退出系统");
  24. System.out.println("请输入你的操作:");
  25. Scanner sc=new Scanner(System.in);
  26. int choice =sc.nextInt();
  27. return choice;
  28. }
  29. }

 NomlUser 类

   NomlUser 类跟AdmiUser 类的构建形式差不多,只不过NomlUser的menu方法中的操作变成了这些:1.查询书籍   2.借阅书籍   3.归还书籍   0.退出系统;以及将IO数组中的初始化值进行的简单的修改,所以,NomlUser 类的整体代码如下:


  1. package User;
  2. import Book.BookList;
  3. import Operate.*;
  4. import User.*;
  5. import java.util.Scanner;
  6. public class NomlUser extends User{
  7. public NomlUser(String name) {
  8. super(name);
  9. this.ios=new IO[]{
  10. new Exit(),
  11. new Find(),
  12. new Borrow(),
  13. new Return()};
  14. }
  15. public int menu(){
  16. System.out.println("欢迎来到用户菜单:");
  17. System.out.println("1.查询书籍");
  18. System.out.println("2.借阅书籍");
  19. System.out.println("3.归还书籍");
  20. System.out.println("0.退出系统");
  21. System.out.println("请输入你的操作:");
  22. Scanner sc=new Scanner(System.in);
  23. int choice =sc.nextInt();
  24. return choice;
  25. }
  26. }

   以上包都进行了简单的创建,现在来实现我们的 Main 类

4. Main 类

    在Main 类中,我们要实现登录界面,并对其进行操作,我们可以在 Main 类中创建一个 login---登录方法,用来实现下面的操作:

   当我们输入我的身份之后,我们就会跳转到相应的用户的 menu 方法来打印对应的菜单,此时我们可以构建一个 if--else 语句,当输入值为 0 时,返回 AdmiUser 中;反之,则返回 NomlUser 中。代码如下:

     那么在我们的 main 方法中,我们就可以直接通过 login 方法的返回值直接创建一个 User 的对象user ,再通过 menu 的返回值来了解用户的选项,那么我们该如何将用户和操作联系起来呢:

     由于我们之前在 BookList 中创建了一个成员变量 --- IO[ ],这时我们可以在书架 BookList 中创建一个 operate 方法,将用户和操作进行联系起来:

   用 ios[ choice ] 调用 ios中构建的操作对象,在引用work方法,达到操作的目的。​​​​​​

    所以,我们在 Main 类中的 main 方法中就可以这样写:

  1. import Book.BookList;
  2. import User.*;
  3. import Operate.*;
  4. import java.util.Scanner;
  5. public class Main {
  6. public static User login(){
  7. Scanner sc=new Scanner(System.in);
  8. System.out.println("请输入你的姓名");
  9. String name=sc.nextLine();
  10. System.out.println("请输入你的身份:0->管理员 1->用户");
  11. int n=sc.nextInt();
  12. if(n==0){
  13. return new AdmiUser(name);
  14. }else{
  15. return new NomlUser(name);
  16. }
  17. }
  18. public static void main(String[] args) {
  19. BookList bookList=new BookList();
  20. User user=login();
  21. while(true) {
  22. int n=user.menu();
  23. user.operate(n, bookList);
  24. }
  25. }
  26. }

综上:大致框架以及构建完毕,现在只需要将操作包中的各个类功能进行完善即可。


5.  完善操作包

1.  增加图书(Add 类):

由于图书有以上几个属性,所以我们要输入这些属性:

    输入完属性之后,我们首先要确定书架中是否含有该图书,通过遍历 booklist 这个数组中的成员就可以判断是否存在该图书;没有则需要增加图书,将图书插在 booklist 的尾部,同时 used Size要增加:

  1. package Operate;
  2. import Book.Book;
  3. import Book.BookList;
  4. import java.util.Scanner;
  5. public class Add implements IO{
  6. public void work(BookList bookList) {
  7. System.out.println("增加图书!!");
  8. Scanner sc=new Scanner(System.in);
  9. System.out.println("请输入你增加的书名:");
  10. String name=sc.nextLine();
  11. System.out.println("请输入书的作者:");
  12. String author=sc.nextLine();
  13. System.out.println("请输入书的类型:");
  14. String type=sc.nextLine();
  15. System.out.println("请输入书的价格:");
  16. double price=sc.nextDouble();
  17. Book book=new Book(name,author,price,type);
  18. int currentSize=bookList.getUsedSize();
  19. //还要检查书架中是否已经存在这本书
  20. for (int i = 0; i < currentSize; i++) {
  21. Book book2= bookList.getBooks(i);
  22. if(book2.equals(book)){
  23. System.out.println("已经存在了!!");
  24. return ;
  25. }
  26. }
  27. bookList.setUsedSize(currentSize+1);
  28. bookList.setBooks(currentSize,book);
  29. }
  30. }

2. 借阅图书 ( Borrow 类 ):

    借阅图书,首先要判断用户输入的图书是否在书架存在,如若存在,则使用将该图书的成员变量 --- isBorrowed 设置成借阅状态,代码如下:

  1. package Operate;
  2. import Book.Book;
  3. import Book.BookList;
  4. import java.util.Scanner;
  5. public class Borrow implements IO{
  6. public void work(BookList bookList) {
  7. System.out.println("借阅图书!!");
  8. System.out.println("请输入你要借阅的书籍:");
  9. Scanner sc=new Scanner(System.in);
  10. String name=sc.nextLine();
  11. int currentSize=bookList.getUsedSize();
  12. int i = 0;
  13. for (; i < currentSize ; i++) {
  14. Book book=bookList.getBooks(i);
  15. if(book.getName().equals(name) && book.isBorrowed()==false){
  16. book.setBorrowed(true);
  17. System.out.println("借阅成功!!");
  18. return ;
  19. }
  20. }
  21. if(i == currentSize) {
  22. System.out.println("你借阅的图书不存在!!");
  23. }
  24. }
  25. }

3. 归还图书 ( Return 类 )

    Return 类 跟 Borrowed 类差不多,将借阅图书的 isBorrowed 修改成” 未借阅 “即可,代码如下:

  1. package Operate;
  2. import Book.Book;
  3. import Book.BookList;
  4. import java.util.Scanner;
  5. public class Return implements IO{
  6. @Override
  7. public void work(BookList bookList) {
  8. System.out.println("归还图书!!");
  9. System.out.println("请输入你要归还的书籍:");
  10. Scanner sc=new Scanner(System.in);
  11. String name=sc.nextLine();
  12. int currentSize=bookList.getUsedSize();
  13. for (int i = 0; i < currentSize ; i++) {
  14. Book book=bookList.getBooks(i);
  15. if(book.getName().equals(name)&& book.isBorrowed()==true){
  16. book.setBorrowed(false);
  17. System.out.println("归还成功!!");
  18. }
  19. }
  20. }
  21. }

4. 查找图书 ( Find 类 )

    原理跟 增加图书 --- Add 类差不多

  1. package Operate;
  2. import Book.Book;
  3. import Book.BookList;
  4. import java.util.Scanner;
  5. public class Find implements IO{
  6. public void work(BookList bookList) {
  7. System.out.println("查找图书!!");
  8. System.out.println("请输入你要查找的图书;");
  9. Scanner sc=new Scanner(System.in );
  10. String name=sc.nextLine();
  11. int currentSize=bookList.getUsedSize();
  12. int i=0;
  13. for (; i < currentSize; i++) {
  14. Book book1=bookList.getBooks(i);
  15. if(name.equals(book1.getName())){
  16. System.out.println("找到了!!你查找的图书信息如下:");
  17. System.out.println(book1);
  18. break;
  19. }
  20. }
  21. if(i==currentSize){
  22. System.out.println("没找到该图书!!");
  23. }
  24. }
  25. }

5. 删除图书 ( Delete 类 )

    删除图书,简单来讲,就是将要删除的图书的后一位覆盖前一位,最后将 booklist 中最后一位置空,然后将 usedSize -1 即可,代码如下:

  1. package Operate;
  2. import Book.Book;
  3. import Book.BookList;
  4. import java.util.Scanner;
  5. public class Delete implements IO{
  6. public void work(BookList bookList) {
  7. System.out.println("删除图书!!");
  8. Scanner sc=new Scanner(System.in);
  9. System.out.println("请输入你要删除的图书:");
  10. String name=sc.nextLine();
  11. int pos=0;
  12. int i = 0;
  13. int currentSize=bookList.getUsedSize();
  14. //先要看书架里面有没有这本书
  15. for (; i < currentSize; i++) {
  16. Book books=bookList.getBooks(i);
  17. if(books.equals(name)){
  18. pos=i;
  19. break;
  20. }
  21. }
  22. int j = pos;
  23. for (; j <currentSize-1; j++) {
  24. //先获取j+1 位置的书籍,在将j+1的书覆盖在j位置
  25. Book book2=bookList.getBooks(j+1);
  26. bookList.setBooks(j,book2);
  27. }
  28. bookList.setBooks(j,null);
  29. bookList.setUsedSize(currentSize-1);
  30. }
  31. }

6. 显示图书 ( Show 类 )

    将图书打印出来,将 booklist 进行遍历 ,在实现打印即可,代码如下:

  1. package Operate;
  2. import Book.Book;
  3. import Book.BookList;
  4. public class Show implements IO{
  5. public void work(BookList bookList) {
  6. System.out.println("打印书单!!");
  7. int currentSize= bookList.getUsedSize();
  8. for (int i = 0; i < currentSize; i++) {
  9. Book book=bookList.getBooks(i);
  10. System.out.println(book);
  11. }
  12. }
  13. }

7. 退出系统 ( Exit 类 )

    可以直接通过 Java 本身的 exit 方法进行编写,代码如下:

  1. package Operate;
  2. import Book.BookList;
  3. public class Exit implements IO{
  4. public void work(BookList bookList) {
  5. System.out.println("退出系统!!");
  6. System.exit(0);
  7. }
  8. }

6.总体实现


以上实现的图书管理系统也存在些许缺陷:就比如 不能做到持久化的保存;用来存储书的是数组……

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/923783
推荐阅读
相关标签
  

闽ICP备14008679号