简易版 图书管理系统

news2025/1/18 6:52:28

目录

1. Book包

1.1 Book类

1.2 BookList类

2. User包

2.1 User抽象类

2.2 AdminUser类

2.3  NormalUser类

3. Operate包

3.1 MyOperate接口

3.2  AddOperation类

3.3  DelOperation类

 3.4 ExitOperation

 3.5  FindOperation类

 3.6 ShowOperation类

 3.7 BorrowedOperation类

3.8 ReturnOperation类

4. Main类


本章作为一个练习,对于前面学过的那些语法进行一个整合运用。

语法方面主要包括:封装就、继承、多态、抽象类和接口。

首先,我们将整个系统分为4个包,

分别是Book类用于封装书和书架的具体信息。

Main包也就是封装主类,用于对整个系统的具体操作。

Operate包用于封装具体的操作。

User包用于管理用户信息。

我们一个包一个包来讲解。

1. Book包

Book包分为两类,分别是书和书架。

1.1 Book类

该类主要是对书的一些基本信息进行封装,并且提供Getting和Setting方法。

package Book;

public class Book {
    private String name;//书名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    @Override
    public String toString() {
        return "Book.Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                //", isBorrowed=" + isBorrowed +
                (isBorrowed  ? "  已经被借出" : "  未被借出") +
                '}';
    }
}

1.2 BookList类

书架的创建:

包括了初始化,以及对一些书籍的基本操作。

package Book;

public class BookList {
    private Book[] books = new Book[10];//创建书架
    private int usedSize;//记录书架上书的数量
    public BookList() {//初始化3本书
        books[0] = new Book("我们仨","杨绛",89,"文学");
        books[1] = new Book("明朝那些事","当年明月",78,"历史");
        books[2] = new Book("红楼梦","曹雪芹",49,"小说");
        this.usedSize = 3;
    }

    public Book[] getBooks() {
        return books;
    }

    public void setBooks(int pos,Book book) {
        books[pos] = book;
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public Book getBook(int pos) {
        return this.books[pos];
    }

    //重写setBook方法作用于设置图书(增删)
    public void setBook(Book book) {
        this.books[usedSize] = book;
    }
    public void setBook(int pos,Book book) {
        this.books[pos] = book;
    }
}

2. User包

User包被分为三类,其中User类是抽象类,用于管理人员类和普通用户类继承。

AdminUser是管理类,NormalUser类是普通用户类。

2.1 User抽象类

因为对于不同的用户而言,他们的访问权限是不同的,所以需要将菜单抽象出来以示区分。

另外就是基本信息。

package User;

import Book.BookList;
import Operate.MyOperate;

//抽象出menu()菜单方法
public abstract class User {
    //protected是访问权限,改为更大的也可以
    protected String name;
    protected MyOperate[] myOperate;//等会到Operate包再讲
    //用户信息
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
    //作用于main方法中对不同的用户进行区分
    public void doWork(int choice, BookList bookList) {
        this.myOperate[choice].work(bookList);
    }
}

2.2 AdminUser类

这里开辟的MyOperate数组是对管理人员的访问权限开辟空间,其中功能包括 退出,查找,增加,删除,显示

package User;

import Operate.*;

import java.util.Scanner;

public class AdminUser extends User {
    //管理人员所拥有的访问权限
    public AdminUser(String name) {
        super(name);
        this.myOperate = new MyOperate[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation(),
        };
    }
    //管理人员拥有的权限
    public int menu() {
        System.out.println("*****************************************");
        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:退出系统");
        Scanner scanner = new Scanner(System.in);
        int choice  = scanner.nextInt();
        return choice;
    }
}

2.3  NormalUser类

这里开辟的MyOperate数组是对普通用户的访问权限开辟空间,其中功能包括 退出,查找,借书,还书

package User;

import Operate.*;

import java.util.Scanner;

public class NormalUser extends User {
    //普通用户所拥有的访问权限
    public NormalUser(String name) {
        super(name);
        this.myOperate = new MyOperate[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperate(),
                new ReturnOperation(),
        };
    }
    //普通用户拥有的权限
    @Override
    public int menu() {
        System.out.println("****************************");
        System.out.println("hello "+name+" 欢迎来到图书小练习");
        System.out.println("1.查找图书!");
        System.out.println("2.借阅图书!");
        System.out.println("3.归还图书!");
        System.out.println("0.退出系统!");
        System.out.println("****************************");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

3. Operate包

Operate的各个操作,增、删、查、借书、还书、退出。

我们 Operate包 将普通用户和管理员用户的具体实现操作类全写在Operate包 中。

3.1 MyOperate接口

MyOperate接口只设计好了各个Operation规范(方法)

package Operate;

import Book.BookList;

public interface MyOperate {
    public void work(BookList bookList);
}

3.2  AddOperation类

本类用于添加书籍得基本信息,并且做了基本的判断。

package Operate;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class AddOperation implements MyOperate {

    @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 author = scanner.nextLine();

        System.out.println("输入类型");
        String type = scanner.nextLine();

        System.out.println("输入价格");
        int price = scanner.nextInt();

        Book book = new Book(name, author, price, type);
        //得到此时书架上书的数量
        int currentSize = bookList.getUsedSize();
        //遍历,查找是否想添加的书已经存在了
        //默认添加在最后面
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if(tmp.getName().equals(name)) {
                System.out.println("已经存在这本书了,不能再放入了!");
                return;//如果存在即退出
            }
        }
        //如果不存在即添加
        bookList.setBook(book);
        //每添加一本书下表向后移
        bookList.setUsedSize(currentSize + 1);

    }
}

3.3  DelOperation类

先上代码:

package Operate;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class DelOperation implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!");
        System.out.println("请输入你要删除图书的名字:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        //得到当前下标
        int currentSize = bookList.getUsedSize();
        int index = -1;
        //遍历,tmp.getName().equals(name)为真即表示书架存在该书
        //否则则该书不存在
        for (int i = 0; i < currentSize; i++) {
            Book tmp = bookList.getBook(i);
            if (tmp.getName().equals(name)) {
                index = i;
                break;
            }
        }
        //图示说明
        for (int j = index; j < currentSize - 1; j++) {
            Book book = bookList.getBook(j+1);
            bookList.setBook(j,book);
        }

        bookList.setUsedSize(currentSize - 1);
        //删除对象,把最后一个设置为bull
        bookList.setBook(currentSize - 1, null);
    }
}

图示:

 假设currentSize 在这里,我们想要删掉该书,那么我们就将currentSize + 1 赋值给currentSize;

接着currentSize向后走:

 重复上述操作:

知道最后一个:

直接将最后一个删除,毕竟每删除一个都需要将 书架上的书减少一本:

这样也解释了为什么之前需要重写setBook()方法。

 3.4 ExitOperation

该类就只提供一个方法:exit()

import Book.BookList;

public class ExitOperation implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");
        System.exit(0);
    }
}

 为什么exit()方法中的参数是0,因为我们正常退出是就是0:

 3.5  FindOperation类

FindOperation类实现很简单,只需要提供书名再进行遍历,当然也可以根据价格、作者进行遍历。

package Operate;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class FindOperation implements MyOperate{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
        System.out.println("请输入书名!");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        //获取当前图书在书架得下标
        int currentSize = bookList.getUsedSize();
        //遍历
        for (int i = 0; i < currentSize; i++) {
            //System.out.println(bookList[i]);
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                System.out.println("找到了这本书");
                System.out.println(book.toString());
                return;
            }
        }
        System.out.println("没有找到"+name);
    }
}

 3.6 ShowOperation类

遍历获取通过Getting方法打印即可。

package Operate;

import Book.Book;
import Book.BookList;

public class ShowOperation implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("打印所有图书!");
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            System.out.println(book);
        }
    }
}

以上便是管理员访问得全部权限,当然有需要还可以自己添加所需要的方法。

后面得便是普通用户特有的权限,普通用户也有FindOperation、ShowOperation。

 3.7 BorrowedOperation类

方法的逻辑很简单,只需稍加注意

package Operate;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class BorrowedOperate implements MyOperate {
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
        System.out.println("请输入你要借阅的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        //获取
        int currentSize = bookList.getUsedSize();
        //遍历
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            //不仅需要判断书是否存在书架上,并且还需要判断是否已经借出
            if (book.getName().equals(name) &&
            book.isBorrowed() == false) {
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return;
            }
        }
    }
}

3.8 ReturnOperation类

逻辑于BorrowedOperation类相似

package Operate;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class ReturnOperation implements MyOperate {

    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
        System.out.println("请输入你要归还的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name) &&
                    book.isBorrowed()) {
                book.setBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
    }
}

4. Main类

 Main类中只有一个类,主类,整个程序的入口。

上代码:

package Main;

import Book.BookList;
import User.AdminUser;
import User.User;
import User.NormalUser;
import java.util.Scanner;

public class Main {
    //提供一个静态方法用于创建身份,是判断管理员还是普通用户
    public static User login() {
        System.out.println("请输入你的姓名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("输入你的身份 1 -> 管理员  2->普通用户");
        int choice = scanner.nextInt();
        if (choice == 1) {
            return new AdminUser(name);
        } else {
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();
        while (true) {
            int choice = user.menu();
            user.doWork(choice,bookList);
        }
    }
}

这里发生了一个向上转型:

 主方法的内容非常简单:

1. 创建一个书架;

2.通过登录方法确认用户信息;

3.一个死循环,不停的使用“权限”,知道用户输入0退出。

这里就体现了面向对象的思想,所有的过程全部封装完成,只对外提供了公开的方法。

本章的思路都非常简单,只是有些地方需要稍加注意,本章的目的便是体验面向对象的思想。

案例演示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL——数据库、表的操作

文章目录数据库的操作创建数据库创建数据库例子字符集和校验规则查看数据库支持的字符集查看默认的字符校验规则校验规则对数据库的影响查看数据库显示详细的创建数据库语句修改数据库删除数据库查看连接情况表的操作创建表显示创建表的详细过程不同的数据库引擎查看表结构修改…

【C语言】操作符与优先级详解

C的操作符 文章目录C的操作符前言一、算术操作符二、移位操作符三、位操作符四、赋值操作符五、单目操作符六、条件操作符七、逻辑操作符八、条件操作符九、逗号表达式十、下标引用、函数调用和结构成员十一、表达式求值11.1 隐式类型转换12.2 算术转换12.2 操作符的属性总结前…

解决Vue前后端跨域问题的多种方式

1 前言 本文主要介绍借助解决Vue前后端跨域问题的几种方式 说到ajax请求&#xff0c;就不得不说下xhr(XMLHttpRequest)了&#xff0c;它可以说是鼻祖&#xff0c;但是实际开发中&#xff0c;我们不会直接使用它&#xff0c;而是进行二次封装或者使用成熟的第三方封装&#xf…

Zookeeper:分布式过程协同技术

Zookeeper 是一个高性能的分布式一致系统&#xff0c;在分布式系统中有着广泛的应用。基于它&#xff0c;可以实现诸如“分布式同步”、“配置管理”、“命名空间管理”等众多功能&#xff0c;是分布式系统中常见的基础系统。Zookeeper 主要用来解决分布式集群中应用系统的一致…

http,https,ip,tcp,udp

http:超文本传输协议&#xff0c;明文传输&#xff0c;不安全 超文本&#xff1a;早期&#xff0c;文本存在本地&#xff0c;文本可以被计算机解析为二进制的数据包&#xff0c;随着发展&#xff0c;出现图片&#xff0c;视频&#xff0c;链接等&#xff0c;成为超文本 传输&a…

批量生成Excel文件,可以按模板进行自动生成

目录 一、文件目录结构 二、编辑生成名单 三、编辑模板 四、生成操作 软件描述&#xff1a;根据Excel模板 和 生成名单 可以批量生成相同格式的文件&#xff0c;可以应用于考核、工资单等文件的批量生成。方便快捷&#xff0c;有需求的小伙伴可以到最下面点击下载 注&#…

mysql 客户端简单搭建

主要使用的是mysql开发包中的api接口 操作流程 1.初始化mysql操作句柄 MYSQL *mysql_init(MYSQL *mysql)&#xff1b; 对传人的句柄进行初始化 若传入的句柄为NULL&#xff0c;则内部会动态申请空间&#xff0c;进行初始化&#xff0c;并返回句柄首地址 返回值&#xff1a;若…

基于51单片机的ds18b20数字华氏温度计

资料编号&#xff1a;114 下面是相关功能视频演示&#xff1a; 114-基于51单片机的数字华氏温度计报警&#xff08;源码仿真全套资料&#xff09;功能讲解&#xff1a; 采用51单片机采集DS18B20的温度&#xff0c;LCD1602显示&#xff0c;并且可以设置上下限值&#xff0c;超…

Unity UI 框架

开源地址&#xff1a; GitHub - NRatel/NRFramework.UI: 基于 Unity UGUI 的 UI 开发框架基于 Unity UGUI 的 UI 开发框架. Contribute to NRatel/NRFramework.UI development by creating an account on GitHub.https://github.com/NRatel/NRFramework.UI 一、需求/功能要点…

headscale的部署方法和使用教程

headscale的部署方法和使用教程1. headscale文件下载2. 上传并赋予文件权限3. 创建以及修改相关配置文件3.1 创建配置目录&#xff1a;3.2 创建目录用来存储数据与证书&#xff1a;3.3 创建空的 SQLite 数据库文件&#xff1a;3.4 创建 Headscale 配置文件&#xff1a;3.5 创建…

Vue 组件间通信并不是每一次操作都会触发新的通信

需求&#xff1a;新增或者修改都需要组件间立马通信。 操作&#xff1a;把B组件(子组件&#xff0c;这里指的是三级联动组件)的数据传输过来&#xff0c;在A(父组件)组件中处理 即 子传父 这里指的是修改页面或者新增页面三级联动下拉选择完之后 点击 提交 会执行A组件的修改操…

开启安全测试评估赛道,永信至诚发布“数字风洞”产品体系

11月19日&#xff0c;永信至诚产品战略发布会上&#xff0c;面向安全测试评估领域的“数字风洞”产品体系战略发布&#xff0c;标志着永信至诚作为网络靶场和人才建设领军企业&#xff0c;再次以“产品乘服务”的价值体系&#xff0c;开启网络安全测试评估专业赛道。 数字化时代…

MySQL安装

本笔记来自B站黑马程序员讲解的MySQL的使用。 目录 ​编辑 一、MySQL的安装 1、数据库基础概念 2、MySQL下载并安装​编辑 三、启动MySQL 四、连接MySQL数据库 1、使用MySQL提供的客户端命令来连接 2、使用Windows 命令打开&#xff1a; 第一步 配置path的环境变量 第…

uniapp入门:常用事件绑定与数据同步

1.常见事件与事件绑定 1.1点击事件bindtap 1.2 文本输入事件bindinput 1.3 切换事件bindtouchend 2.数据同步 2.1事件回调 2.2逻辑层中page对象中的中数据如何进行改变 2.3页面触发事件如何传参到page中数据 …

ASEMI代理艾赛斯二极管DSA300I100NA,肖特基DSA300I100NA

编辑-Z 艾赛斯硅肖特基二极管DSA300I100NA参数&#xff1a; 型号&#xff1a;DSA300I100NA 最大重复反向阻断电压&#xff08;VRRM&#xff09;&#xff1a;100V 反向电流、漏极电流&#xff08;IR&#xff09;&#xff1a;3mA 正向电压降&#xff08;VF&#xff09;&…

STM32CubeMX外部中断

建议提前学习&#xff1a;使用STM32CubeMX实现按下按键&#xff0c;电平反转&#xff1b; 目录 EXTI 中断 中断的概念 抢占优先级与响应优先级 中断分组 事件 上升沿&#xff0c;下降沿以及双边沿触发 上升沿&#xff0c;下降沿以及双边沿的概念 上升沿&#xff0c;下…

数据结构-双链表思路解析及代码实现

双链表是单链表的进阶版&#xff0c;单链表是1-2-3-4 一个个排排坐链接&#xff0c;只管向后拉手&#xff0c;其主要思想是当前节点与下一节点的关系&#xff0c;那么双链表就多了一层关系&#xff0c;当前节点不仅和一下一点连起来&#xff0c;也要和上一节点串联起来。与前与…

【全志T113-S3_100ask】13-1 Linux c语言ioctl驱动oled(iic、ssd1306)屏幕

【全志T113-S3_100ask】13-1 Linux C通过ioctl驱动oled[ssd1306]屏幕 背景&#xff08;一&#xff09;i2c关键结构体1、i2c_rdwr_ioctl_data结构体2、struct i2c_msg结构体&#xff08;二&#xff09;i2c关键代码1、写函数2、读函数&#xff08;三&#xff09;对oled的操作&…

深度学习和神经网络的介绍(一)

1、深度学习和神经网络 1.1 深度学习的介绍 目标&#xff1a; 知道什么是深度学习知道深度学习和机器学习的区别能够说出深度学习的主要应用场景知道深度学习的常见框架 1.1.1 深度学习的概念 深度学习是机器学习的分支&#xff0c;是一种以人工神经网络为架构&#xff0c…

计算机网络4小时速成:计算机网络基础,计网组成,计网分类,性能指标,标准化组织,计网结构模型,五层模型

计算机网络4小时速成&#xff1a;计算机网络基础&#xff0c;计网组成&#xff0c;计网分类&#xff0c;性能指标&#xff0c;标准化组织&#xff0c;计网结构模型&#xff0c;五层模型 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&…