小言_互联网的博客

Java实现图书管理系统

368人阅读  评论(0)

作者:~小明学编程 

文章专栏:JavaSE基础

格言:目之所及皆为回忆,心之所想皆为过往

今天给大家带来的是用Java实现的图书管理系统。

目录

需求

图书类

创建图书类

创建书架

Operation

IOperation接口

添加图书AddOperation

借阅图书BorrowOperation

删除图书DelOperation

打印图书DisplayOperation

退出系统ExitOperation

查询书籍FindOperation

归还书籍ReturnOperation

user

User

NormalUser

AdminUser

Main

演示


需求

1 、简单的登录
2 、管理端
查阅书籍
增加书籍
删除书籍
打印书籍列表
退出
3 、用户端
查询书籍
借阅书籍
归还书籍
退出

图书类

首先我们创建一个book包,在包里面放一个Book类和一个BookList类。

然后创建一个operation里面放的是我们的各种操作方法。

接着是我们的user类,里面分别放我们的管理员的类和普通成员的类。

最后就是我们的Main类,我们的程序从这里开始执行。

创建图书类

首先我们需要创建一个图书类,该类里面是我们的图书属性例如书名,作者名,价格等等。


  
  1. public class Book {
  2. //书名
  3. private String name;
  4. //作者名
  5. private String author;
  6. //价格
  7. private int price;
  8. //书的类型
  9. private String type;
  10. //是否借出
  11. private boolean isBorrowed;
  12. public Book (String name, String author, int price, String type) {
  13. this.name = name;
  14. this.author = author;
  15. this.price = price;
  16. this.type = type;
  17. }
  18. public String getName () {
  19. return name;
  20. }
  21. public void setName (String name) {
  22. this.name = name;
  23. }
  24. public String getAuthor () {
  25. return author;
  26. }
  27. public void setAuthor (String author) {
  28. this.author = author;
  29. }
  30. public int getPrice () {
  31. return price;
  32. }
  33. public void setPrice (int price) {
  34. this.price = price;
  35. }
  36. public String getType () {
  37. return type;
  38. }
  39. public void setType (String type) {
  40. this.type = type;
  41. }
  42. public boolean isBorrowed () {
  43. return isBorrowed;
  44. }
  45. public void setBorrowed (boolean borrowed) {
  46. isBorrowed = borrowed;
  47. }
  48. @Override
  49. public String toString () {
  50. return "Book{" +
  51. "name='" + name + '\'' +
  52. ", author='" + author + '\'' +
  53. ", price=" + price +
  54. ", type='" + type + '\'' +
  55. ((isBorrowed== true)? ",已借出": ",未借出") +
  56. '}';
  57. }
  58. }

定义好我们的基本变量之后,然后给出set和get方法,方便之后对数据的修改,最后重写一下我们的toString()方法,便于直接打印。

创建书架

创建好我们书的类之后就是该创建书架了,所谓书架就是存放我们的书的,这里我们可以在里面给一个数组,用于存放不同的书。

然后就是给出我们书的数量,这里我们定义一个userSize用来记录我们图书的数量。


  
  1. public class BookList {
  2. private Book[] books = new Book[ 10];
  3. private int userSize;
  4. public BookList () {
  5. books[ 0] = new Book( "三体", "刘慈欣", 80, "科幻");
  6. books[ 1] = new Book( "平凡的世界", "路遥", 88, "文学");
  7. books[ 2] = new Book( "明朝那些事儿", "当年明月", 180, "历史");
  8. this.userSize = 3;
  9. }
  10. public int getUserSize () {
  11. return userSize;
  12. }
  13. public void setUserSize (int userSize) {
  14. this.userSize = userSize;
  15. }
  16. //获取到pos位置的书
  17. public Book getPos (int pos) {
  18. return this.books[pos];
  19. }
  20. //设置pos位置下标的一本书
  21. public void setBooks (int pos,Book book) {
  22. this.books[pos] = book;
  23. }
  24. }

然后就是set和get方法用于我们对userSize的调整,同时我们给出了调整我们书架里面书的方法。

这里我们给了一个构造方法,用于给我们的书架初始化放上三本书(小编我最爱看的对我影响最大的三本书哈哈),并且指定了书的个数userSize的大小为3。

Operation

该包里面装着我们的所有的对bookList的操作,还有一个接口IOperation,

IOperation接口


  
  1. public interface IOperation {
  2. void work (BookList bookList);
  3. }

添加图书AddOperation


  
  1. public class AddOperation implements IOperation {
  2. public void work (BookList bookList) {
  3. Scanner scanner = new Scanner(System.in);
  4. System.out.println( "添加图书操作");
  5. System.out.println( "请输入书名:");
  6. String name = scanner.nextLine();
  7. System.out.println( "请输入作者:");
  8. String Author = scanner.nextLine();
  9. System.out.println( "请输入类型:");
  10. String type = scanner.nextLine();
  11. System.out.println( "请输入价格:");
  12. int price = scanner.nextInt();
  13. Book book = new Book(name,Author,price,type);
  14. bookList.setBooks(bookList.getUserSize(),book);
  15. bookList.setUserSize(bookList.getUserSize()+ 1);
  16. }
  17. }

借阅图书BorrowOperation


  
  1. public class BorrowOperation implements IOperation {
  2. public void work (BookList bookList) {
  3. System.out.println( "借书操作");
  4. Scanner scanner = new Scanner(System.in);
  5. System.out.println( "请输入想要借阅的书:");
  6. String name = scanner.nextLine();
  7. for ( int i = 0; i < bookList.getUserSize(); i++) {
  8. if (name.equals(bookList.getPos(i).getName())== true) {
  9. if(bookList.getPos(i).isBorrowed()== true) { //判断一下该书是否已经被借阅了
  10. System.out.println( "该书已经被借阅");
  11. } else {
  12. bookList.getPos(i).setBorrowed( true);
  13. System.out.println( "借阅成功!");
  14. }
  15. return;
  16. }
  17. }
  18. System.out.println( "您想要借阅的书不存在");
  19. }
  20. }

删除图书DelOperation


  
  1. public class DelOperation implements IOperation {
  2. public void work (BookList bookList) {
  3. System.out.println( "删除图书操作");
  4. Scanner scanner = new Scanner(System.in);
  5. System.out.println( "输入想要删除图书的名称:");
  6. String name = scanner.nextLine();
  7. //循环遍历所有图书
  8. for ( int i = 0; i < bookList.getUserSize(); i++) {
  9. //找到书名后进行删除
  10. if (name.equals(bookList.getPos(i).getName())== true) {
  11. for ( int j = i; j < bookList.getUserSize()- 1; j++) {
  12. bookList.setBooks(j,bookList.getPos(j+ 1));
  13. }
  14. bookList.setBooks(bookList.getUserSize(), null); //防止内存泄漏
  15. bookList.setUserSize(bookList.getUserSize()- 1);
  16. System.out.println( "删除完毕!");
  17. return;
  18. }
  19. }
  20. System.out.println( "您要删除的图书不存在");
  21. }
  22. }

打印图书DisplayOperation


  
  1. public class DisplayOperation implements IOperation {
  2. public void work (BookList bookList) {
  3. System.out.println( "打印图书操作");
  4. for ( int i = 0; i < bookList.getUserSize(); i++) {
  5. System.out.println(bookList.getPos(i));
  6. }
  7. }
  8. }

退出系统ExitOperation


  
  1. public class ExitOperation implements IOperation {
  2. public void work (BookList bookList) {
  3. System.out.println( "退出操作");
  4. System.exit( 0);
  5. }
  6. }

查询书籍FindOperation


  
  1. public class FindOperation implements IOperation {
  2. public void work (BookList bookList) {
  3. System.out.println( "查询操作");
  4. Scanner scanner = new Scanner(System.in);
  5. System.out.println( "请输入查找的书名:");
  6. String name = scanner.nextLine();
  7. for ( int i = 0; i < bookList.getUserSize(); i++) {
  8. if (name.equals(bookList.getPos(i).getName())== true) {
  9. System.out.println( "信息如下");
  10. System.out.println(bookList.getPos(i));
  11. return;
  12. }
  13. }
  14. System.out.println( "没有找到该书!");
  15. }
  16. }

归还书籍ReturnOperation


  
  1. public class ReturnOperation implements IOperation {
  2. public void work (BookList bookList) {
  3. System.out.println( "返回操作");
  4. Scanner scanner = new Scanner(System.in);
  5. System.out.println( "请输入想要归还的书:");
  6. String name = scanner.nextLine();
  7. for ( int i = 0; i < bookList.getUserSize(); i++) {
  8. if (name.equals(bookList.getPos(i).getName())== true) {
  9. if(bookList.getPos(i).isBorrowed()== false) { //判断一下该书是否已经被借阅了
  10. System.out.println( "该书已经归还");
  11. } else {
  12. bookList.getPos(i).setBorrowed( false);
  13. System.out.println( "归还成功!");
  14. }
  15. return;
  16. }
  17. }
  18. System.out.println( "您想要归还的书不存在");
  19. }
  20. }

以上就是我们对BookList的操作部分。

user

我们的user这个部分是我们的分部管理,因为我们登录的时候会提醒我们是普通用户登录还是管理员登录,所以我们至少需要创建两个类,但是这两个类肯定会有很多相似的方法和成员,所以这个时候我们就再创建一个User的抽象类,然后让我们AdminUser管理员的类和我们的NormalUser普通类分别继承我们的User

User


  
  1. public abstract class User {
  2. protected String name; //用户姓名
  3. protected IOperation[] iOperation; //定义接口类型的数组每个元素指向实现接口的对象
  4. public User (String name) {
  5. this.name = name;
  6. }
  7. //此时的menu为后续的动态绑定做准备
  8. public abstract int menu ();
  9. public void doWork (int choice, BookList bookList) {
  10. iOperation[choice].work(bookList);
  11. }
  12. }

这里我们的抽象类有name成员,还有IOperation类型的数组,这里也解释了为什么我们刚刚要创建接口,因为有了接口我们后面可以向接口里面放我们的操作方法,因为其它的类都实现了我们的接口并且重写了接口里面的work()方法。

NormalUser


  
  1. public class NormalUser extends User{
  2. public NormalUser (String name) {
  3. super(name);
  4. this.iOperation = new IOperation[]{
  5. new ExitOperation(),
  6. new FindOperation(),
  7. new BorrowOperation(),
  8. new ReturnOperation(),
  9. };
  10. }
  11. public int menu () {
  12. System.out.println( "********管理员菜单********");
  13. System.out.println( " 欢迎"+ this.name+ "进入菜单");
  14. System.out.println( "1.查找图书");
  15. System.out.println( "2.借阅图书");
  16. System.out.println( "3.归还图书");
  17. System.out.println( "0.退出系统");
  18. System.out.println( "************************");
  19. Scanner scanner = new Scanner(System.in);
  20. int choice = scanner.nextInt();
  21. return choice;
  22. }
  23. }

这里首先是我们的构造方向,先帮父类构造,然后将IOperation进行初始化里面放着是我们普通用户所能进行的一系列操作,再下面就是我们的菜单方法,因为我们的普通用户和管理员所能进行的操作是不一样的,同时选择我们需要的操作。

AdminUser


  
  1. public class AdminUser extends User{
  2. public AdminUser (String name) {
  3. super(name);
  4. this.iOperation = new IOperation[]{
  5. new ExitOperation(),
  6. new FindOperation(),
  7. new AddOperation(),
  8. new DelOperation(),
  9. new DisplayOperation(),
  10. };
  11. }
  12. public int menu () {
  13. System.out.println( "********管理员菜单********");
  14. System.out.println( " 欢迎"+ this.name+ "进入菜单");
  15. System.out.println( "1.查找图书");
  16. System.out.println( "2.新增图书");
  17. System.out.println( "3.删除图书");
  18. System.out.println( "4.显示图书");
  19. System.out.println( "0.退出系统");
  20. System.out.println( "************************");
  21. Scanner scanner = new Scanner(System.in);
  22. int choice = scanner.nextInt();
  23. return choice;
  24. }
  25. }

管理员类就是菜单里面的方法和IOperation数组与前面有一点区别。

Main


  
  1. public class Main {
  2. public static User login () {
  3. System.out.println( "请输入你的姓名:");
  4. Scanner scanner = new Scanner(System.in);
  5. String name = scanner.nextLine();
  6. System.out.println( "请输入你的身份:1->管理员 0->普通用户");
  7. int choice = scanner.nextInt();
  8. //根据选择直接返回我们的对象。
  9. if (choice== 1) {
  10. return new AdminUser(name);
  11. } else {
  12. return new NormalUser(name);
  13. }
  14. }
  15. public static void main (String[] args) {
  16. BookList bookList = new BookList();
  17. //发生向上转型
  18. User user = login();
  19. //此时将发生动态绑定
  20. while ( true) {
  21. int choice = user.menu();
  22. user.doWork(choice, bookList);
  23. }
  24. }
  25. }

首先看我们的主函数,我么new了一个BookList也就是我们的书架,然后开始登录操作输入身份之后最后返回一个用户的对象,此时我们拥有了两个对象,一个是书架bookList,还有就是我们的用户对象,然后我们的用户就可以对我们的书架进行一系列的操作了。

首先就是打印我们的菜单,顺便返回我们的操作,接着拿着我们的操作choice和我们的书架bookList去执行,user.doWork(),拿着我们的choice找到我们IOperation找到对应的操作最后完成指定的功能。

演示

 


转载:https://blog.csdn.net/m0_56911284/article/details/127177051
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场