• 图书管理系统


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    文章目录

    目录

                                           图书管理系统

    前言

                                           

    一.界面设计

    1.管理员菜单

    2.用户菜单

    3.用户操作:

    4.管理员操作

    二. Book包

      1.book类

      2. booklist类

    三.接口和实现类的操作包

    Ioperation接口

    1.管理员实现类:

    2.普通用户

    四.User包

    1.NormalUser类

    2.AdminUser类

    五.最难的整合

    Main类


    前言

    提示:这里可以添加本文要记录的大概内容:

    用已经学过的面向对象的思想来设计一个图书页面(用到的技术有继承,多态,封装,抽象类,接口)


    提示:以下是本篇文章正文内容,下面案例可供参考

    一.界面设计

    书架里面默认放置三本书,有俩个角色管理员和普通用户,角色各自有四个功能,这四个功能对于角色具体实现是不同的

    Book{name='三国演义', author='罗贯中', price=42, type='小说', 未借出}
    Book{name='红楼梦', author='曹雪芹', price=50, type='小说', 未借出}
    Book{name='西游记', author='吴承恩', price=58, type='小说', 未借出}
    Book{name='水浒传', author='施耐庵', price=40, type='小说', 未借出}

     

    1.管理员菜单

    2.用户菜单

    3.用户操作:

    查找图书

    借阅图书

    归还图书

    显示图书

    见界面设计处

    管理员操作

    查找图书

    新增图书

    类似于用户的新增图书

    删除图书

    类似于用户删除图书


    二. Book包

    1.book类

    注意toString 方法,为了便于输出借还状态,根据isborrowed真假来输出借出还是没借出,由于初始执行都没借出,所以借还状态不需要set方法(成员变量默认值false)

    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. 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. }
    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 int getPrice() {
    27. return price;
    28. }
    29. public void setPrice(int 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 == true) ? "已经借出" : "未借出") +
    52. '}';
    53. }
    54. }

      2. booklist类

    1. package 图书管理系统.book;
    2. import 图书管理系统.book.Book;
    3. public class BookList {
    4. private Book[] books = new Book[10];
    5. private int usdSize;
    6. public BookList() {
    7. books[0]=new Book("三国演义","罗贯中",42,"小说");
    8. books[1]=new Book("红楼梦","曹雪芹",50,"小说");
    9. books[2]=new Book("西游记","吴承恩",58,"小说");
    10. books[3]=new Book("水浒传","施耐庵",40,"小说");
    11. this.usdSize=4;
    12. }
    13. //修改图书数量
    14. public void setUsdSize(int usdSize){
    15. this.usdSize=usdSize;
    16. }
    17. //获得图书数量
    18. public int getUsdSize(){
    19. return usdSize;
    20. }
    21. //放书
    22. public void setBook(int pos,Book book){
    23. books[pos]=book;
    24. }
    25. //取书
    26. public Book getBook(int pos){
    27. return books[pos];
    28. }
    29. }

    三.接口和实现类的操作包

    将相关的操作统一规范成接口,接口里面操作图书,有一个work抽象方法,七个实现类需要重写该方法。

    Ioperation接口

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

    注意:退出系统,由于要回收资源(释放图书资源),所以还是需要实现接口

    具体实现类见下文:

    1.管理员实现类:

    findOperation查找图书

    遍历一遍书籍,书籍的总个数在currentSize保存,在书架中调,书架中的具体书是book,

    判断找没找到,直接在书架中依次遍历book,用book名字和输出的字符串比较,由于字符串比较直接调用equals方法即可,找到返回book信息

    1. package operation;
    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. Scanner scanner = new Scanner(System.in);
    10. System.out.println("请输入你要查找图书的名字");
    11. String name = scanner.nextLine();
    12. //遍历一遍书籍,书名相同返回图书
    13. int currentSize = bookList.getUsdSize();
    14. for (int i = 0; i < currentSize; i++) {
    15. Book book=bookList.getBook(i);
    16. if(book.getName().equals(name)){
    17. System.out.println("找到了这本书");
    18. System.out.println(book);
    19. return;
    20. }
    21. }
    22. System.out.println("没找到你要的这本书");
    23. }
    24. }

    DisplayOperation显示图书

    直接遍历书籍,输出每本书的信息即可,由于book对象已经重写了toString()方法,打印book对象时,实际上调用的是我们重写的tostring方法,打印相关信息

    1. package operation;
    2. import 图书管理系统.book.BookList;
    3. import java.util.Scanner;
    4. public class DisplayOperation implements IOperation{
    5. @Override
    6. public void work(BookList bookList) {
    7. System.out.println("显示图书");
    8. int currentSize=bookList.getUsdSize();
    9. for (int i = 0; i
    10. System.out.println(bookList.getBook(i));
    11. }
    12. }
    13. }

    Addoperation新增图书

    由用户自己输入书籍的信息,新建一本书(调用book构造方法),然后获取当前书籍的数量currentSize,由于图书下标从0开始,直接将新书放到书架第currentSize位置处,书架中书籍数量+1

     目前三本书将第四本书放到空白位置,也就是currentSize==3,下标为4,放完后usesized+1

    1. package operation;
    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. int currentSize=bookList.getUsdSize();
    20. bookList.setBook(currentSize,book);
    21. bookList.setUsdSize(currentSize+1);
    22. System.out.println("新增书籍成功");
    23. }
    24. }

    删除图书:

    类似于新增图书,只不过要将setusedsize-1

    1. package operation;
    2. import 图书管理系统.book.Book;
    3. import 图书管理系统.book.BookList;
    4. import java.util.Scanner;
    5. public class DeleteOperation 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. int currentSize = bookList.getUsdSize();
    13. for (int i = 0; i < currentSize; i++) {
    14. Book book = bookList.getBook(i);
    15. if (book.getName().equals(name)) {
    16. bookList.setUsdSize(currentSize - 1);
    17. System.out.println("删除成功");
    18. return;
    19. }
    20. }
    21. }
    22. }

    退出系统:

    库函数exit 0是状态码,退出成功的意思

    1. package operation;
    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. }

    2.普通用户

    借阅图书

    类似于查找图书,找到借阅的图书,将状态(setborrowed)改为true

    1. package operation;
    2. import 图书管理系统.book.Book;
    3. import 图书管理系统.book.BookList;
    4. import java.util.Scanner;
    5. public class BorrowOperation 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. int currentSize=bookList.getUsdSize();
    13. for (int i = 0; i
    14. Book book=bookList.getBook(i);
    15. if(book.getName().equals(name)) {
    16. book.setBorrowed(true);
    17. System.out.println("借阅成功");
    18. return;
    19. }
    20. }
    21. }
    22. }

    归还图书

    类似于查找图书,找到借阅的图书,将状态(setborrowed)改为false

    1. package operation;
    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. Scanner scanner=new Scanner(System.in);
    10. System.out.println("请输入你要归还图书的名字");
    11. String name=scanner.nextLine();
    12. int currentSize=bookList.getUsdSize();
    13. for (int i = 0; i
    14. Book book=bookList.getBook(i);
    15. if(book.getName().equals(name)) {
    16. book.setBorrowed(true);
    17. System.out.println("归还成功");
    18. return;
    19. }
    20. }
    21. }
    22. }

    四.User包

    1. package User;
    2. import operation.IOperation;
    3. import 图书管理系统.book.BookList;
    4. public abstract class User {
    5. protected String name;
    6. protected IOperation[] iOperations;
    7. public User(String name) {
    8. this.name = name;
    9. }
    10. public abstract int menu();
    11. public void doOperation(int choice, BookList bookList){
    12. this.iOperations[choice].work(bookList);
    13. }
    14. }

    1.NormalUser类

    1. package User;
    2. import operation.*;
    3. import java.util.Scanner;
    4. public class NormalUser extends User {
    5. public NormalUser(String name){
    6. super(name);
    7. this.iOperations = new IOperation[]{
    8. new ExitOperation(),
    9. new FindOperation(),
    10. new BorrowOperation(),
    11. new ReturnOperation(),
    12. };
    13. }
    14. public int menu(){
    15. System.out.println("hello "+name+" 欢迎来到图书小练习");
    16. System.out.println("1.查找图书!");
    17. System.out.println("2.借阅图书!");
    18. System.out.println("3.归还图书!");
    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. }

    2.AdminUser类

    1. package User;
    2. import operation.*;
    3. import java.util.Scanner;
    4. public class AdminUser extends User{
    5. public AdminUser(String name){
    6. super(name);
    7. this.iOperations=new IOperation[]{
    8. new ExitOperation(),
    9. new FindOperation(),
    10. new AddOperation(),
    11. new DeleteOperation(),
    12. new DisplayOperation()
    13. };
    14. }
    15. public int menu(){
    16. System.out.println("hello "+name+" 欢迎来到图书小练习");
    17. System.out.println("1.查找图书!");
    18. System.out.println("2.新增图书!");
    19. System.out.println("3.删除图书!");
    20. System.out.println("4.显示图书");
    21. System.out.println("0.退出系统!");
    22. System.out.println("请输入你的操作:");
    23. Scanner sc=new Scanner(System.in);
    24. int n=sc.nextInt();
    25. return n;
    26. }
    27. }

    五.最难的整合

    Main类

    首选我们先准备好图书,调用构造方法,进入登录页面,登录页面输入姓名,身份后,选择,注意根据你的选择来决定登录的返回值是普通用户,还是管理员,由于他们俩个都继成了user类,所以返回值填user(动态绑定和向上转型),当普通用户调用login(选择是0),实际上返回的是normaruser,返回值由user接受,这是向上转型,此时调用user.menu实际上就是重写的normaruse这是动态绑定。打印出界面之后,绑定的user(用户或者管理员),调用其doOperation方法,这是根据用户选的操作数来决定调用哪个接口里的work方法,如图所示:

    1. import User.AdminUser;
    2. import User.NormalUser;
    3. import User.User;
    4. import 图书管理系统.book.BookList;
    5. import java.util.Scanner;
    6. public class Main {
    7. //动态绑定
    8. public static User login(){//登陆 发生了向上转型
    9. Scanner sc=new Scanner(System.in);
    10. System.out.println("请输入你的姓名");
    11. String name=sc.nextLine();
    12. System.out.println("请输入你的身份:1:-》管理员,0-》普通用户");
    13. int choice=sc.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. //开始整合,最难的部分
    22. BookList bookList = new BookList();//准备图书
    23. //登陆user这个引用,引用哪个对象?
    24. User user=login();
    25. while(true){
    26. int choice=user.menu();
    27. user.doOperation(choice, bookList);
    28. }
    29. }
    30. }

    这样初步的系统框架就搞定了

  • 相关阅读:
    【审视】Scrum Master的检查清单
    C++:栈与队列,优先级队列
    AI全栈大模型工程师(十九)Semantic Kernel
    ubuntu-hadoop伪分布
    交互设计主要做什么?新手入门必读
    PG SQL 问题:Character with value 0x0a must be escaped
    全志 d1 licheerv opensbi uboot linux debian
    Pandas性能优化:进阶篇
    Eureka添加@Loadbalanced 报错 No instances available for XXXXX
    B/S 架构 与 C/S 架构
  • 原文地址:https://blog.csdn.net/panpanaa/article/details/127949503