• 图书管理系统【java】


    目录

    🥇1.设计背景

    🔎2.设计思路

    🔑3.book包

    📗3.1 Book类的实现

    📕3.2 BookList类的实现(书架)

    🔑4.user包

    📙4.1 User类的实现

    📒4.2 AdminUser(管理员)

    📘4.3 Normal(普通用户)

    👜5.opera包

    1️⃣5.1 IOperation接口的实现

    2️⃣AddOperation(添加操作)

    3️⃣FindOperation(查找操作)

    4️⃣DelOperation(删除操作)

    5️⃣ShowOperation(显示操作)

    6️⃣BorrowOperation(借阅操作)

    7️⃣ReturnOperation(归还操作)

    8️⃣ExitOperation(退出系统)

    ⛳6.Main类

    🔥7.整体效果


     

    🌈今天我们来做一个小东西,目标就是使用学过的知识来实现——《图书管理系统》小练习

    🥇1.设计背景

    📝图书馆作为每个大学或者城市必不可少的部分,其存放的海量书籍与文献使得其管理显得尤为困难,此时图书管理系统就起到了一个重大的作用。本次就将使用java语言中的异常处理,多态,继承,封装,接口等知识点,来综合性的设计与实现出一个简易的图书管理系统。

    00ac3c4f28314ea585e028c11bda6e07.png

    🔎2.设计思路

    07ffce2ee7a045148a37c81aa9f0bd5a.png

    🔑3.book包

    📗3.1 Book类的实现

    ➡️首先我们建立一个 book 的包,在这里我们继续创建一个 book 的类,根据我们的设计思路,我们这里书籍的属性有书名、作者、价格、类型以及是否被借出我们结合封装性,将属性设置为 private 权限,并提供相应的get方法和set方法,空参构造器,以及一个不包含是否被借出的构造器(布尔值的默认类型就是false,可以不进行初始化)并需要提供对应的toString()方法的重写,代码实现如下:

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

    📕3.2 BookList类的实现(书架)

    ✨作为书架,那么可以放若干本书,那么如何放置若干本书呢?

    🙉首先我们提供一个泛型数组,用usedSize来记录当前books数组中有多少本书,并且给出具体的书的参数,供对应的get和set方法

    1. public class BookList {
    2. private static final int DEFAULT_SIZE = 10;
    3. private Book[] books = new Book[DEFAULT_SIZE];
    4. private int usedSize;//记录当前books数组中有多少本书
    5. public BookList() {
    6. books[0] = new Book("三国演义","罗贯中",89,"小说");
    7. books[1] = new Book("西游记","吴承恩",78,"小说");
    8. books[2] = new Book("红楼梦","曹雪芹",49,"小说");
    9. this.usedSize = 3;
    10. }
    11. public Book getBook(int pos) {
    12. return this.books[pos];
    13. }
    14. public void setBook(Book book) {
    15. this.books[usedSize] = book;
    16. }
    17. public void setBook(int pos,Book book) {
    18. this.books[pos] = book;
    19. }
    20. public void setBooks(int pos,Book book) {
    21. books[pos] = book;
    22. }
    23. public int getUsedSize() {
    24. return usedSize;
    25. }
    26. public void setUsedSize(int usedSize) {
    27. this.usedSize = usedSize;
    28. }
    29. }

    🔑4.user包

    ➡️创建一个user包,这个包有两个用户类型,一个是管理员,一个是普通用户,并且它们的功能各不相同,但是都与要输入用户姓名,因此可以用一个User类当作一个父类

    📙4.1 User类的实现

    ✨首先定义一个用户的名字,同时要提供set和get方法get方法,并提供抽象Operation方法给子类重写使用(用户不同,操作流程不同),同时定义一个抽象方法menu():不同的对象菜单不同

    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 doWork(int choice, BookList bookList) {
    9. this.iOperations[choice].work(bookList);//this.iOperations[choice]-------对象
    10. }
    11. }

    📒4.2 AdminUser(管理员)

    ✨管理管的操作需要继承用户类,并且实现构造方法,同时实现抽象方法Operation(),包括:退出,查找、新增、删除、显示图书的功能,最后输入具体的操作:

    1. import opera.*;
    2. import java.util.Scanner;
    3. public class AdminUser extends User{
    4. //子类继承父类的构造方法
    5. public AdminUser(String name) {
    6. super(name);
    7. this.iOperations = new IOperation[]{
    8. new ExitOperation(),
    9. new FindOperation(),
    10. new AddOperation(),
    11. new DelOperation(),
    12. new ShowOperation()
    13. };
    14. }
    15. //菜单
    16. public int menu() {
    17. System.out.println("*********************************");
    18. System.out.println("hello " + name + " 欢迎来到图书管理系统");
    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. System.out.println("请输入你的操作:");
    26. Scanner scanner = new Scanner(System.in);
    27. int choice = scanner.nextInt();
    28. return choice;
    29. }
    30. }

    📘4.3 Normal(普通用户)

    ✨普通用户的操作需要继承用户类,并且实现构造方法,同时实现抽象方法Operation(),包括:退出,查找、借出、归还图书的功能,最后输入具体的操作:

    1. package user;
    2. import opera.*;
    3. import java.util.Scanner;
    4. /**
    5. * Created with IntelliJ IDEA.
    6. * Description:
    7. * User: Lenovo
    8. * Date: 2022-11-17
    9. * Time: 15:53
    10. */
    11. public class NormalUser extends User{
    12. //子类继承父类的构造方法
    13. public NormalUser(String name) {
    14. super(name);
    15. this.iOperations = new IOperation[] {
    16. new ExitOperation(),
    17. new FindOperation(),
    18. new BrrowOperation(),
    19. new ReturnOperation()
    20. };//拿到当前对象引用,并初始化
    21. }
    22. @Override
    23. public int menu() {
    24. System.out.println("*********************************");
    25. System.out.println("hello " + name + " 欢迎来到图书管理系统");
    26. System.out.println("1.查找图书!");
    27. System.out.println("2.借阅图书!");
    28. System.out.println("3.归还图书!");
    29. System.out.println("0.退出系统!");
    30. System.out.println("*********************************");
    31. System.out.println("请输入你的操作:");
    32. Scanner scanner = new Scanner(System.in);
    33. int choice = scanner.nextInt();
    34. return choice;
    35. }
    36. }

    👜5.opera包

    👉建立一个操作包,用来实现具操作的功能,例如添加图书,删除图书等。

    1️⃣5.1 IOperation接口的实现

    1. package opera;
    2. import book.BookList;
    3. public interface IOperation {
    4. void work(BookList bookList);
    5. }

    2️⃣AddOperation(添加操作)

    ✨首先我们需要新增一本书,具体的要求之前已经给出,在这里难点就是:我们增加的图书应该放在最后一本书的后边,并且如果这本书存在的话就不需要再次放入。最互放入书籍之后需要将整个书籍数+1

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class AddOperation implements IOperation{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("新增图书!");
    9. Scanner scanner = new Scanner(System.in);
    10. System.out.println("请输入书名:");
    11. String name = scanner.nextLine();
    12. System.out.println("请输入作者:");
    13. String author = scanner.nextLine();
    14. System.out.println("请输入类型:");
    15. String type = scanner.nextLine();
    16. System.out.println("请输入价格:");
    17. int price = scanner.nextInt();
    18. Book book = new Book(name,author,price,type);
    19. //书籍默认放到数组最后一本书的后面
    20. int currentSize = bookList.getUsedSize();
    21. for (int i = 0; i < currentSize; i++) {
    22. Book tmp = bookList.getBook(i);
    23. if(tmp.getName().equals(name)) {
    24. System.out.println("已经存在这本书,不能再存储了!");
    25. return;
    26. }
    27. }
    28. bookList.setBook(book);
    29. //修改usedSize
    30. bookList.setUsedSize(currentSize+1);
    31. }
    32. }

    3️⃣FindOperation(查找操作)

    ✨遍历数组,有两种情况:找到了或者没找到,逻辑思路比较清晰

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class FindOperation implements IOperation{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("查找图书!");
    9. System.out.println("请输入书名");
    10. Scanner scanner = new Scanner(System.in);
    11. String name = scanner.nextLine();
    12. int currentSize = bookList.getUsedSize();
    13. for (int i = 0; i < currentSize; i++) {
    14. Book book = bookList.getBook(i);
    15. if(book.getName().equals(name)) {
    16. System.out.println("找到了这本书:");
    17. System.out.println(book);
    18. return;
    19. }
    20. }
    21. System.out.println("没有这本书!");
    22. }
    23. }

    4️⃣DelOperation(删除操作)

    ✨同样需要遍历数组,找到删除的书籍,在这里一个难点就是:当把书籍的下边删除之后需要将后边的下标依次向前挪动,并在这里挪动的时候不可以发生数组越界。最后书籍数量-1,并且需要将最后一个数组置为null即为没有

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. import java.util.Scanner;
    5. public class DelOperation implements IOperation{
    6. @Override
    7. public void work(BookList bookList) {
    8. System.out.println("删除图书!");
    9. System.out.println("请输入你要删除的图书的名字");
    10. Scanner scanner = new Scanner(System.in);
    11. String name = scanner.nextLine();
    12. int currentSize = bookList.getUsedSize();
    13. int index = -1;
    14. for (int i = 0; i < currentSize; i++) {
    15. Book tmp = bookList.getBook(i);
    16. if(tmp.getName().equals(name)) {
    17. index = 1;
    18. break;
    19. }
    20. }
    21. //挪动数据
    22. for (int j = index; j < currentSize-1; j++) {
    23. Book book = bookList.getBook(j+1);
    24. bookList.setBook(j,book);
    25. }
    26. //修改size
    27. bookList.setUsedSize(currentSize-1);
    28. //因为删除的是对象 所以把最后一个置为null
    29. bookList.setBook(currentSize-1,null);
    30. System.out.println("删除成功!");
    31. }
    32. }

    5️⃣ShowOperation(显示操作)

    ✨显示图书比较简单,只需要遍历数组即可

    1. package opera;
    2. import book.Book;
    3. import book.BookList;
    4. public class ShowOperation implements IOperation{
    5. @Override
    6. public void work(BookList bookList) {
    7. System.out.println("显示图书");
    8. int currentSize = bookList.getUsedSize();
    9. for (int i = 0; i < currentSize; i++) {
    10. Book book = bookList.getBook(i);
    11. System.out.println(book);
    12. }
    13. }
    14. }

    6️⃣BorrowOperation(借阅操作)

    ✨遍历数组,判断其是否已被借出

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

    7️⃣ReturnOperation(归还操作)

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

    8️⃣ExitOperation(退出系统)

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

    ⛳6.Main类

    Main类主要是把以上所有功能串起来,并且实现整个图书管理系统

    1. import book.BookList;
    2. import user.AdminUser;
    3. import user.NormalUser;
    4. import user.User;
    5. import java.util.Scanner;
    6. public class Main {
    7. public static User logic() {
    8. System.out.println("请输入你的姓名:");
    9. Scanner scanner = new Scanner(System.in);
    10. String name = scanner.nextLine();
    11. System.out.println("请输入你的身份:1->管理员 0->普通用户");
    12. //输入身份会实例化一个对象
    13. int choice = scanner.nextInt();
    14. if(choice == 1) {
    15. return new AdminUser(name);
    16. }else {
    17. return new NormalUser(name);
    18. }
    19. }
    20. public static void main(String[] args) {
    21. BookList bookList = new BookList();
    22. User user = logic();
    23. while(true) {
    24. int choice = user.menu();//动态绑定 1️⃣向上转型;2️⃣重写;3️⃣通过父类引用,调用这个父类和子类重写的方法
    25. //根据 choice 和 user 来确定我到底调用哪个对象的哪个操作?
    26. user.doWork(choice,bookList);
    27. }
    28. }
    29. }

    🔥7.整体效果

    c6263a9269244f15867bd6723754accc.png

     

     

     

     

     

  • 相关阅读:
    知识付费小程序的推广与用户增长策略
    浅谈“天线和通信历史“
    C#的基于.net framework的Dll模块编程(二) - 编程手把手系列文章
    【Leetcode】189. 轮转数组
    面试官:我看你简历上写了MySQL,对MySQL InnoDB引擎的索引了解吗?
    TimeWise-Jira工时管理插件6.0.0发布!对比测评某知名工时插件,谁的数据处理性能更胜一筹?
    另一个博客
    阿里云部署应用
    【微信读书】数据内容接口逆向调试02
    庆国庆,拟物地图
  • 原文地址:https://blog.csdn.net/m0_72161237/article/details/127879040