Java图书管理系统(代码及详解)(二)

简介: Java图书管理系统(代码及详解)

2.1  opperation包下的类


因为每一个操作都需要访问书架BookList所以我们留一个IOperation的接口里面留一个

work(BookList bookList);方法让下面的操作访问书架

2.1.1  AddOperation(添加操作)


这里新增图书并放在书架的顶部位置

getUsedSize在BookList类中得到书的本数并在对应的位置放上添加的数再让书的本书+1

public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("添加图书");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入添加书籍的名称》");
        String name=scanner.nextLine();
        System.out.println("请输入作者的姓名》");
        String auther=scanner.nextLine();
        System.out.println("请输入书籍的价格》");
        int price=scanner.nextInt();
        System.out.println("请输入书籍的类型》");
        scanner.nextLine();
        String type=scanner.nextLine();
        Book book=new Book(name,auther,price,type);
        bookList.setBooks(bookList.getUsedSize(),book);
        System.out.println("添加成功!");
        bookList.setUsedSize(bookList.getUsedSize()+1);
    }
}

2.1.2  DeltOperation(删除操作)


遍历寻找要找的书籍并把每一个书籍向前移动,到了链表就可以更加快捷

需要注意的是名字的比较要用equals方法 A.equals(B)如果使用A==B比较的是它们对应的地址

public class DeltOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        System.out.println("请输入你想要删除书籍的名称》");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        int size=bookList.getUsedSize();
        boolean key=false;
        for (int i = 0; i < size-1; i++) {
            if (bookList.getBooks(i).getName().equals(name)||key==true) {
                Book book=bookList.getBooks(i+1);
                bookList.setBooks(i,book);
            }
        }
        bookList.setUsedSize(bookList.getUsedSize()-1);
        System.out.println("删除成功!");
    }
}

2.1.3  DisPlayOperation(书籍展示)

这里的就用到了Book类中对Objecrt的toString方法重写

这里肯定会有人疑问为什么不直接用Systeam.out.println(books[i])来输出书籍的信息呢?

这里的books是private修饰的我们做了封装处理,

public class DisPlayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
        int size=bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            System.out.println(bookList.getBooks(i));
        }
    }
}

2.1.4  FindOperation(查找操作)


这里的寻找对应名字也要用equals方法

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        System.out.println("请输入想要查找的图书》");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        int size= bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            if (bookList.getBooks(i).getName().equals(name)) {
                System.out.println(bookList.getBooks(i));
                return;
            }
        }
        System.out.println("未找到你想要寻找的书");
    }
}

2.1.5  BorrowOperation(借阅操作)


这里遍历一遍再将对应位置的借阅情况更改下就好了

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        System.out.println("请输入你要借阅书籍的名称》");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        int size=bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            if(bookList.getBooks(i).getName().equals(name)) {
                bookList.getBooks(i).setBorrowed(true);
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("未找到相关书籍!");
    }
}

2.1.6 ReturnOperation (归还操作)


public class ReturnOperaion implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("请输入你要归还图书的名称》");
        Scanner scanner=new Scanner(System.in);
        String name= scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.getBooks(i).getName().equals(name)) {
                bookList.getBooks(i).setBorrowed(true);
                System.out.println("归还成功!期待下次借阅!");
                return;
            }
        }
        System.out.println("未找到此书籍!归还失败!请到前台咨询此服务!");
    }
}

2.1.7 ReturnOperation (退出系统)


public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出程序");
        exit(1);
    }
}

users包的操作实现用户和管理者的界面与操作逻辑


3.1.1 User类


这个类是用户和管理者的父类需要被继承,这样设计的一方面原因是面向对象语言的特点,还有一方面是这样实现可以简略代码的重复便于理解

这个类中我们要定义name来存放用户和管理者的名字,menu菜单功能在这个里面不需要实现就使用抽象类abstract修饰再对应的子类实现对应的菜单,操作需要按照菜单进行操作所以我们需要一个IOperation这个类的操作数组有人会异或为什么是IOpernation类型呢?这只是一个接口为什么要用它,这里其实发生了向上转型,这个数组将存放各种书架操作,而这些操作是需要IOpernation接口,全部展开就是IOpernation iOpernation=new AddOpernation......这些操作,可以理解成父类继承的向上转型然后再运行时发生动态绑定将对应的menu方法和操作方法替换

里面写一个doOperation实现功能方法

this.iOperations[choice].work(bookList)里this就是本类的iOpernations操作数组的第choice个操作对应的work实现方法。

public abstract class User {
    protected String name;
    protected IOperation[] iOperations;
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
    public void doOperation(int choice, BookList bookList) {
        this.iOperations[choice].work(bookList);
    }
}

3.1.2  AdminUser管理员


重写对应的menu和对应的操作数组

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.iOperations=new IOperation[] {
                new ExitOperation(),
                new DisPlayOperation(),
                new FindOperation(),
                new AddOperation(),
                new DeltOperation()
        };
    }
    @Override
   public int menu() {
        System.out.println("hello "+name);
        System.out.println("1.显示图书");
        System.out.println("2.查找图书");
        System.out.println("3.添加图书");
        System.out.println("4.删除图书");
        System.out.println("0.退出系统");
        System.out.println("请输入你的操作》");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

3.1.3 NormalUser用户


也是重写对应的menu以及操作方法数组

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOperations=new IOperation[] {
                new ExitOperation(),
                new DisPlayOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperaion()
        };
    }
    @Override
    public int menu() {
        System.out.println("hello "+name);
        System.out.println("1.显示图书");
        System.out.println("2.查找图书");
        System.out.println("3.借阅图书");
        System.out.println("4.归还图书");
        System.out.println("0.退出系统");
        System.out.println("请输入你的操作》");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

下面是实现这些所有功能的类

这里我们需要先写一个login里面写登录的基本语言以及选择管理员登录还是用户登录

public static User login() {
        System.out.println("欢迎来到图书系统!");
        System.out.println("请输入你的昵称》");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        System.out.println("1.用户登录    2.管理员登录");
        int user=scanner.nextInt();
        if(user==1){
            return new NormalUser(name);
        }else {
            return new AdminUser(name);
        }
    }

再使用main来串联起这些所有功能,使对应的用户功能实现在对应的内部实现

image.png编辑

以上就是图书管理系统的内容了,完整代码放在22_5_18_book/src · 404NOt/Java - 码云 - 开源中国 (gitee.com)

我的总结可能不是十分到位,也可能会有专业上的疏忽欢迎在评论区留言!

相关文章
|
1月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
65 1
|
1天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
11 3
|
27天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
50 24
|
9天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
48 2
|
23天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
63 5
|
23天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
48 5
|
25天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
29天前
|
Java API Maven
商汤人像如何对接?Java代码如何写?
商汤人像如何对接?Java代码如何写?
36 5
|
1月前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
47 5
Java反射机制:解锁代码的无限可能
|
1月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
42 1