当前位置:   article > 正文

Java_实现图书管理系统

Java_实现图书管理系统

目录

前言

框架核心思想

框架的实现

书类和书架类的实现

功能接口实现

功能的声明

父类用户和子类管理员,子类普通用户

Main方法


前言

java图书管理系统的详细解析;从思考到实现,一步步带你学会图书管理系统.

框架核心思想

下图只是一个图书管理系统的初步思考,有个大概就行,不必深究

框架的实现

书类和书架类的实现

首先我们实现书类 

  1. public class Book{
  2. private String name;//书名
  3. private String author;//作者
  4. private int price;//价格
  5. private String type;//类型
  6. private boolean lend;//是否借出,false表示未借阅,true表示已借阅
  7. //构造方法
  8. public Book(String name, String author, int price, String type) {
  9. this.name = name;
  10. this.author = author;
  11. this.price = price;
  12. this.type = type;
  13. //不用对lend进行初始化,因为默认就是false
  14. }
  15. }

 实现书架类

  1. public class BookList{
  2. private Book[] book;//书架,存放书的数组
  3. private int number;//图书种类个数
  4. public BookList() {
  5. this.book = new Book[10];
  6. //new Book类存到 数组中
  7. this.book[0] = new Book("三国演义","罗贯中",33,"名著");
  8. this.book[1] = new Book("西游记","吴承恩",33,"名著");
  9. this.book[2] = new Book("红楼梦","曹雪芹",33,"名著");
  10. this.number = 3;
  11. }
  12. }

功能接口实现

我们首先应该创建一个接口,让所有功能应用这个接口

然后我们创建一个该接口类型的数组A,接收功能(类似子类继承父类的向上转型)

例如:管理员权限的话  在管理员类中的数组A 就存储 添加,删除,修改,显示等功能

而普通用户权限的话 就在普通用户类中的数组A存储 查找,借阅,归还等功能

 接口实现

  1. public abstract interface IOperation {
  2. abstract void work(BookList bookList);//让实现这个接口的功能都重写这个方法
  3. //里面的参数是书架,功能肯定都是对书架进行增,删,查,改等功能
  4. }

功能的声明

根据功能接口实现,我们需要重写 work ,以及主要功能的实现也都是在work中进行的

这里只是对功能的声明,没有实现功能,我们先对功能声明完,创建好框架后最后再对系统进行实现

添加图书功能

  1. public class AddOperation implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. System.out.println("添加图书");
  5. }
  6. }

借阅图书功能

  1. public class BorrowOperation implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. System.out.println("借阅图书");
  5. }
  6. }

退出系统功能

  1. public class ExitOperation implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. System.out.println("退出系统");
  5. }
  6. }

以此类推, FindOperation 查找功能,ListAllBooks 展示图书,ReturnOperation 归还图书

RmoveOperation 删除图书, UpdateOperation 修改图书

父类用户和子类管理员,子类普通用户

作为父类的 用户类

  1. public abstract class User {
  2. protected String name;
  3. protected IOperation[] iOperations;//可以存放功能的接口数组
  4. public User(String name) {//构造方法,不过本项目中,输入的姓名没有任何作用
  5. this.name = name;
  6. }
  7. public abstract int menu();//菜单,管理员 和 普通用户的不一样,所以都重写
  8. public void doOperation(int input, BookList bookList) {//实现功能
  9. iOperations[input].work(bookList);//input是下标,用下标来访问功能数组中的功能
  10. }
  11. }

 作为子类的 管理员

  1. //管理员
  2. public class AdminUser extends User {
  3. public AdminUser(String name) {
  4. super(name);//把用户名传到父类
  5. super.iOperations = new IOperation[]{//存储管理员权限的功能
  6. new ExitOperation(),
  7. new FindOperation(),
  8. new AddOperation(),
  9. new RmoveOperation(),
  10. new ListAllBooks(),
  11. new UpdateOperation()
  12. };
  13. }
  14. @Override
  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("4. 显示图书");
  21. System.out.println("5. 修改图书");
  22. System.out.println("0. 退出系统");
  23. System.out.println("*****************");
  24. Scanner scanner = new Scanner(System.in);
  25. while(true) {
  26. int input = scanner.nextInt();
  27. if (input > 5 || input < 0) {
  28. System.out.println("输入错误,请重新输入!");
  29. continue;
  30. }
  31. return input;
  32. }
  33. }
  34. }

作为子类的 普通用户

  1. //普通用户
  2. public class NormalUser extends User{
  3. public NormalUser(String name) {
  4. super(name);
  5. super.iOperations = new IOperation[]{
  6. new ExitOperation(),
  7. new FindOperation(),
  8. new BorrowOperation(),
  9. new ReturnOperation()
  10. };
  11. }
  12. @Override
  13. public int menu() {
  14. System.out.println("*****************");
  15. System.out.println("1. 查找图书");
  16. System.out.println("2. 借阅图书");
  17. System.out.println("3. 归还图书");
  18. System.out.println("0. 退出系统");
  19. System.out.println("*****************");
  20. System.out.println("请输入指令:");
  21. Scanner scanner = new Scanner(System.in);
  22. while(true) {
  23. int input = scanner.nextInt();
  24. if (input > 3 || input < 0) {
  25. System.out.println("输入错误,请重新输入!");
  26. continue;
  27. }
  28. return input;
  29. }
  30. }
  31. }

Main方法

首先是让用户输入是管理员或是普通用户,所以我们需要返回类型为User的输入方法,这样可以返回管理员或是普通用户

  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.管理员 2.普通用户");
  7. int input = scanner.nextInt();
  8. if (input == 1) {
  9. return new AdminUser(name);
  10. }else {
  11. return new NormalUser(name);
  12. }
  13. }
  14. public static void main(String[] args) {
  15. BookList bookList = new BookList();//先初始化书架
  16. //根据用户输入的身份 来分别实现
  17. User user = login();//用普通用户和管理员的共同的父类(向上转型),来接收(因为不知道那个)
  18. while(true) {
  19. int input = user.menu();//会打印相应的菜单,并返回输入的指令
  20. user.doOperation(input,bookList);//根据指令来进行相应功能的实现
  21. }
  22. }
  23. }

功能实现的铺垫

首先我们需要给 图书类 和 书架类 添加一些 get 和 set的方法(没有get 和 set 就无法获取和更改 类中的值,扩展:一般类中 都是用 get 和 set的方法来获取和更改成员变量的,这样更加安全)

实际程序的开发中,我们是每写一个功能,想到了需要什么,再去相应的类写get或set的

这里是为了更直观地观察,便直接全部写出

图书类 的添加

  1. public class Book{
  2. private String name;//书名
  3. private String author;//作者
  4. private int price;//价格
  5. private String type;//类型
  6. private boolean lend;//是否借出
  7. public Book(String name, String author, int price, String type) {
  8. this.name = name;
  9. this.author = author;
  10. this.price = price;
  11. this.type = type;
  12. }
  13. //===============
  14. //添加部分↓↓↓
  15. @Override
  16. public String toString() {//toString的重写,是为了打印图书的时候,按照我们自己的格式来打印
  17. return "Book{" +
  18. "name='" + name + '\'' +
  19. ", author='" + author + '\'' +
  20. ", price=" + price +
  21. ", type='" + type + '\'' +
  22. ", " + (lend == true ? "已借出" : "未借出") +
  23. '}';
  24. }
  25. public String getName() {//获取书名,在展示图书功能中需要用到
  26. return name;
  27. }
  28. public void setLend(boolean lend) {//更改借阅情况,在用户借出书或归还书后需要用到
  29. this.lend = lend;
  30. }
  31. public boolean getLend() {//获取借阅情况,在判断图书是否借出时需要用到
  32. return lend;
  33. }
  34. }

书架类 的 添加

  1. public class BookList{
  2. private Book[] book;//书架
  3. private int number;//图书种类个数
  4. public BookList() {
  5. this.book = new Book[10];
  6. //new 一个 Book类存到 数组中
  7. this.book[0] = new Book("三国演义","罗贯中",33,"名著");
  8. this.book[1] = new Book("西游记","吴承恩",33,"名著");
  9. this.book[2] = new Book("红楼梦","曹雪芹",33,"名著");
  10. this.number = 3;
  11. }
  12. //===============
  13. //添加部分↓↓↓
  14. public Book getBook(int number) {//获取存放书的数组,查找,展示功能都需要用到
  15. return this.book[number];
  16. }
  17. public void setBook(Book book,int number) {//修改存放书的数组,number参数是要修改哪个下标
  18. this.book[number] = book;
  19. }
  20. public int getNumber() {//获取书架上 图书的种类 在遍历书架查找/展示的时候需要用到
  21. return number;
  22. }
  23. public void setNumber(int number) {//修改书架上 图书的种类 添加和删除图书功能都需要用到
  24. this.number = number;
  25. }
  26. }

功能的实现

功能的实现都比较简单,难点主要是怎么构思出图书管理系统的构架,怎么把它们用类,接口联系起来

添加图书功能

  1. public class AddOperation implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. Scanner scanner = new Scanner(System.in);
  5. System.out.println("添加图书");
  6. System.out.println("请输入书名:");
  7. String name = scanner.nextLine();
  8. System.out.println("请输入作者:");
  9. String author = scanner.nextLine();
  10. System.out.println("请输入价格:");
  11. int price = scanner.nextInt();
  12. System.out.println("请输入类型:");
  13. String none = scanner.nextLine();//读取nextInt 的回车,否则type直接读取然后结束
  14. String type = scanner.nextLine();
  15. Book book = new Book(name,author,price,type);
  16. bookList.setBook(book, bookList.getNumber());//把新增图书放入下标为图书种类数的书架数组中
  17. bookList.setNumber( bookList.getNumber() + 1 );//让书架中的图书种类加1
  18. System.out.println("添加成功");
  19. }
  20. }

借阅图书功能

  1. public class BorrowOperation implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. System.out.println("借阅图书");
  5. System.out.println("要借阅的书名:");
  6. Scanner scanner = new Scanner(System.in);
  7. String name = scanner.nextLine();
  8. for (int i = 0; i < bookList.getNumber(); i++) {
  9. if (name.equals(bookList.getBook(i).getName())) {
  10. System.out.println("借阅成功!");
  11. bookList.getBook(i).setLend(true);
  12. return;
  13. }
  14. }
  15. System.out.println("没有要借阅的书籍!");
  16. }
  17. }

系统退出功能

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

查找图书功能

  1. public class FindOperation implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. System.out.println("查找图书");
  5. System.out.println("请输入要查找的书名:");
  6. Scanner scanner = new Scanner(System.in);
  7. String name = scanner.nextLine();
  8. for (int i = 0; i < bookList.getNumber(); i++) {
  9. if (name.equals(bookList.getBook(i).getName())) {
  10. System.out.println("已找到!");
  11. System.out.println(bookList.getBook(i));
  12. return;
  13. }
  14. }
  15. System.out.println("没有要查找的图书!");
  16. }
  17. }

展示全部图书功能

  1. public class ListAllBooks implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. System.out.println("展示图书列表:");
  5. for (int i = 0; i < bookList.getNumber(); i++) {
  6. System.out.println(bookList.getBook(i));
  7. }
  8. }
  9. }

归还图书功能

  1. public class ReturnOperation implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. System.out.println("归还图书");
  5. System.out.println("输入要归还的书名:");
  6. Scanner scanner = new Scanner(System.in);
  7. String name = scanner.nextLine();
  8. for (int i = 0; i < bookList.getNumber(); i++) {
  9. if (name.equals(bookList.getBook(i).getName())) {
  10. if (bookList.getBook(i).getLend()) {
  11. bookList.getBook(i).setLend(false);
  12. System.out.println("归还成功");
  13. return;
  14. }else {
  15. System.out.println("该图书没有借出!");
  16. return;
  17. }
  18. }
  19. }
  20. System.out.println("没有该图书!");
  21. }
  22. }

删除图书功能

  1. public class RmoveOperation implements IOperation{
  2. private void del(BookList bookList,int number) {//number是坐标
  3. for (int j = number; j < bookList.getNumber()-1; j++) {
  4. bookList.setBook(bookList.getBook(j+1),j);//把后面的图书放前面
  5. bookList.setBook(null,j+1);//对后面的图书进行置空
  6. //避免内存泄露(内存浪费) 如果不置空:移动后虽然当前位置j也指向后面j+1的图书,但是如果执行
  7. //删除指令,把当前图书删除掉,那么j+1的指向了一个删掉了的图书,造成内存泄漏
  8. }
  9. bookList.setNumber(bookList.getNumber()-1);
  10. System.out.println("删除成功!");
  11. }
  12. @Override
  13. public void work(BookList bookList) {
  14. System.out.println("删除图书");
  15. System.out.println("请输入要删除的书名:");
  16. Scanner scanner = new Scanner(System.in);
  17. String name = scanner.nextLine();
  18. for (int i = 0; i < bookList.getNumber(); i++) {
  19. if (name.equals(bookList.getBook(i).getName())) {
  20. del(bookList,i);
  21. return;
  22. }
  23. }
  24. System.out.println("没有要删除的图书!");
  25. }
  26. }

修改图书功能

  1. public class UpdateOperation implements IOperation{
  2. @Override
  3. public void work(BookList bookList) {
  4. System.out.println("修改图书");
  5. System.out.println("请输入要修改的书名:");
  6. Scanner scanner = new Scanner(System.in);
  7. String name = scanner.nextLine();
  8. for (int i = 0; i < bookList.getNumber(); i++) {
  9. if (name.equals(bookList.getBook(i).getName())) {
  10. System.out.println("已找到!");
  11. System.out.println("修改后的书名:");
  12. String name2 = scanner.nextLine();
  13. System.out.println("修改后的作者:");
  14. String author = scanner.nextLine();
  15. System.out.println("修改后的价格:");
  16. int price = scanner.nextInt();
  17. System.out.println("修改后的类型:");
  18. String none = scanner.nextLine();
  19. String type = scanner.nextLine();
  20. Book book = new Book(name2,author,price,type);
  21. bookList.setBook(book,i);
  22. System.out.println("修改成功!");
  23. return;
  24. }
  25. }
  26. }
  27. }

 

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

闽ICP备14008679号