• 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. }

     

  • 相关阅读:
    从源码看vue(v3.2.41)中的diff原理
    WZOI-302猴子选大王
    使用Springboot时,Controller层有方法的参数是一个实体类,但是并不需要其中所有的参数
    Android Studio 六大基础布局详解
    关于Docker中容器之间互相访问问题
    搞笑段子很皮的文案系列001,可爱有趣文案系列合集
    时间序列预测算法梳理(Arima、Prophet、Nbeats、NbeatsX、Informer)
    MyBatis3源码深度解析(十)MyBatis常用工具类(三)MetaObject&MetaClass
    【CSS】css常用复杂选择器都有哪些?看这一篇就够了_07
    【分布式系统】面向结构化数据的分布式存储
  • 原文地址:https://blog.csdn.net/qq_48858380/article/details/134422095