基于Java封装继承多态实现的一个简单图书系统

news2024/11/20 15:24:22

首先我们大概了解下图书系统的需求

 1.要有两种身份 管理员和普通用户。普通用户和管理员分别对应的功能不一样,需要分开实现

2. 图书系统肯定要有图书,和存放图书的地方,存放就用数组来实现

3.实现对应用户的功能

接下来我们第一步:

首先创建一个book的包,里面存放图书类和存放图书的列表

在图书类中我们要有图书的属性,我们这边简易版只有图书名,作者,类型,价格和图书状态(借出,未被借出)

因为是自己使用,为了安全性使用private修饰,然后构造get,set方法来进行set值和get值,在构造一个toString方法,方便后面来打印,还有一个带参数的构造方法,方便后面进行新建图书

接下来实现存放图书

首先需要创建一个数组来存放书,还需要记录当前书的数量,然后我们可以给数组一个默认的长度,和初始化图书,在初始化时就有几本默认的书,我们需要一个通过下标获取到数组中的书

图书的定义初始化和存放做完后,我们来实现用户

用户分为管理员用户和普通用户,管理员用户和普通用户都是用户,我们就可以定义一个父类User类,然后字类AdminUser和NormalUser来继承父类中共有的方法

父类中定义姓名,然后创建一个User的构造方法,doOperation方法后面会讲到

现在我们要创建我们要实现功能的类,因为每个类都要使用work(BookList bookList)的方法,我们封装一个接口给其他功能类使用

然后逐次创建,继承IOPeration接口,创建完后我们来实现主函数

主函数里要定义一个登陆方法,然后返回用户给系统

 因为登陆函数返回了用户,我们主函数调用登陆方法,第一步知道是进入哪个用户,然后通过choice来决定调用的是哪个方法,doOperation这个方法在上面已经实现,传入choice和书的列表,choice则是通过在普通用户类和管理员用户类中的menu()方法,然后输入,通过choice来接收,传给了doOperation方法,根据choice选择对应的方法

接下来我们挨个实现展示图书,查找图书,新增图书,归还图书,借阅图书,退出图书系统,删除图书的各项功能。

展示图书:

查找图书:

 新增图书:

 借阅图书:

 删除图书:

 退出系统:

归还图书:

 

接下来我给完整版代码:

Book类: 

package book;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 21:49
 */
public class Book {
    private String name;
    private String author;
    private String type;
    private int price;
    private boolean isBorrowed;


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

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

    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 String getType() {
        return type;
    }

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

    public int getPrice() {
        return price;
    }

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

    public boolean isBorrowed() {
        return isBorrowed;
    }
    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
}
BookList类:
package book;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 21:49
 */
public class BookList {
    private Book[] books;  //数组来存放书

    private int usedSize; //记录当前书架上  实际存放的书的数量

    //默认容量
    private static final int DEFAULT_CAPACITY = 10;

    public BookList(){
        this.books = new Book[DEFAULT_CAPACITY];
        //放好书
        this.books[0] = new Book("三国演义","罗贯中","小说",10);
        this.books[1] = new Book("西游记","吴承恩","小说",120);
        this.books[2] = new Book("红楼梦","曹雪芹","小说",110);
        this.books[3] = new Book("斗破苍穹","天蚕土豆","小说",20);

        this.usedSize = 4;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

    //获取数组某一个下标的书
    public Book getBook(int pos){
//        if (pos >= 0){
//            return books[pos];
//        } else {
//            System.out.println("下标错误");
//            //return new Exception();
//            //throw new Exception("下标错误"); //抛出异常
//        }
        return books[pos];
    }

    //通过数组的下标的位置来放书
    public void setBooks(int pos,Book book){
        books[pos] = book;
    }

    public Book[] getBooks() {
        return books;
    }
}
User类:
package user;

import book.BookList;
import operation.IOPeration;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:12
 */
public abstract class User {
    protected  String name;

    //定义一个存放方法的数组
    protected IOPeration[] ioPerations;

    public User(String name){
        this.name = name;
    }

    public abstract int menu();

    //通过传入choice来判断调用的方法
    public void doOperation(int choice, BookList bookList)  {
        ioPerations[choice].work(bookList);
    }
}
AdminUser类:
package user;

import operation.*;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:14
 */
public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()

        };
    }

    public int menu(){
        System.out.println("******管理员用户*******");
        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);
        System.out.println("请输入你的操作");
        int choice = scanner.nextInt();

        return choice;
    }
}

NormalUser类:

package user;

import operation.*;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:14
 */
public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()

        };

    }

    public int menu(){
        System.out.println("*****普通用户********");
        System.out.println("1. 查找图书");
        System.out.println("2. 借阅图书");
        System.out.println("3. 归还图书");
        System.out.println("0. 退出系统");
        System.out.println("*************");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choice = scanner.nextInt();

        return choice;
    }
}

主函数:

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 23:18
 */
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 user = login();
        while (true){
            int choice = user.menu();
            //System.out.println("choice: " + choice);
            //根据choice的选择来决定调用的是哪个方法
            user.doOperation(choice,bookList);
        }



    }
}

接口

IOPeration:
package operation;

import book.BookList;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:06
 */
public interface IOPeration {
    void work(BookList bookList);
}

 

功能实现类:

AddOperation:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:02
 */
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 author = scanner.nextLine();

        System.out.println("请输入要添加书的类型");
        String type = scanner.nextLine();

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

        Book book = new Book(name,author,type,price);

        //检查数组当中有没有这本书
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book1 = bookList.getBook(i);
            if (book1.getName().equals(name)){
                System.out.println("有相同的书了,不进行存放");
                return;
            }
        }
        if (currentSize == bookList.getBooks().length){
            System.out.println("图书已经被放满,不能放了");
        } else {
            //将书放在下标的最后一个位置
            bookList.setBooks(currentSize,book);
            //将书的数量加1
            bookList.setUsedSize(currentSize+1);
        }
        System.out.println("新增成功");
    }
}
BorrowOperation:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:04
 */
public class BorrowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        //System.out.println("借阅图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借阅的书名");
        String name = scanner.nextLine();

        int curredSize = bookList.getUsedSize();

        int i = 0;

        for (; i < curredSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)){
                if (book.isBorrowed() == false){
                    book.setBorrowed(true);
                    System.out.println("借阅成功");
                    System.out.println(book);
                    return;
                } else {
                    System.out.println("图书已被借阅,不能再次借出");
                    return;
                }

            }
        }
        System.out.println("你借阅的图书不存在");

    }
}
DelOperation:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:02
 */
public class DelOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        //System.out.println("删除图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的书名");
        String name = scanner.nextLine();

        int pos = -1;
        int i = 0;
        int currentSize = bookList.getUsedSize();
        for (; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)){
                pos = i;
                break;
            }
        }

        if (i == currentSize){
            System.out.println("没有你要删除的图书!");
            return;
        }
        //开始删除
        int j = pos;
        for (; j < currentSize-1 ; j++) {
            Book book = bookList.getBook(j+1);
            bookList.setBooks(j,book);
        }

        //将j置为空
        bookList.setBooks(j,null);
        //将书的数量减1
        bookList.setUsedSize(currentSize-1);
        System.out.println("删除成功");
    }
}
ExitOperation:
package operation;

import book.BookList;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:03
 */
public class ExitOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出图书系统!");
        System.exit(0);
    }
}
FindOperation:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:02
 */
public class FindOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        //System.out.println("查找图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的书!");
        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)){
                System.out.println("找到了这本书,信息如下");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到这本书");
    }
}
ReturnOperation:
package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:04
 */
public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        //System.out.println("归还图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还的书名");
        String name = scanner.nextLine();

        int curredSize = bookList.getUsedSize();

        int i = 0;

        for (; i < curredSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)){
                if (book.isBorrowed() == true){
                    book.setBorrowed(false);
                    System.out.println("归还成功");
                    System.out.println(book);
                    return;
                } else {
                    System.out.println("该图书没有被借出,无需归还");
                    return;
                }

            }
        }
        System.out.println("你归还的图书不存在");
    }
}
ShowOperation:
package operation;

import book.Book;
import book.BookList;

/**
 * @author xiaofan
 * @version 1.0
 * @date 2023/11/14 22:03
 */
public class ShowOperation implements IOPeration{
    @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);
        }
    }
}

仓库地址:Java学习仓库,从入门到精通: Java入门学习 - Gitee.com

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

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

相关文章

react重要知识点(面经)

react重要知识点&#xff08;面经&#xff09; react生命周期classhooks reduxredux 核心概念redux 计数器案例 react页面加载卡顿使用懒加载异步加载JavaScript压缩和缓存静态资源使用React.memo() PubSub使用方式1.1 react导入库1.2 react 页面引入pubsubjs1.3 pubsubjs使用2…

企业要满足什么条件才能实施CRM系统?

CRM的作用相信大家也所有了解&#xff0c;但并不是所有的企业都适合实施CRM。或者说&#xff0c;大部分企业实施CRM并不会100%的成功。那么&#xff0c;企业实施CRM的条件是什么&#xff1f;下面我们就来说一说。 1、业务规模 如果您的客户数量较少&#xff0c;没有复杂的客户…

数据中心走向绿色低碳,液冷存储舍我其谁

引言&#xff1a;没有最冷&#xff0c;只有更冷&#xff0c;绿色低碳早已成为行业关键词。 【全球存储观察 &#xff5c; 科技热点关注】 每一次存储行业的创新&#xff0c;其根源离不开行业端的用户需求驱动。 近些年从数据中心建设的整体发展情况来看&#xff0c;从风冷到…

隧道ip网络广播系统

隧道ip网络广播系统 隧道ip网络广播系统的优势有那些&#xff1f; 节省人力及维护成本&#xff1a;隧道ip网络广播系统可以自动播放节目&#xff0c;无需人工操作&#xff0c;节省了人力成本。定时广播&#xff0c;分区广播&#xff0c;全区广播&#xff0c;方便管理和简易化…

钩子函数-hook

钩子函数-hook hook 的作用 利用钩子函数可以在所有测试用例执行前做一些预置操作&#xff08;如&#xff1a;准被测试数据、测试环境&#xff09; 或者在测试结束后做一些后置操作&#xff08;如&#xff1a;清理测试数据&#xff09; 钩子函数在其它框架中也有&#xff0…

在线客服系统源码 聊天记录实时保存 附带完整的搭建教程

在线客服系统是一个企业网站进行网络营销的最重要的工具。企业进行网络宣传后&#xff0c;会有很多访客进入到网站&#xff0c;这时候网站就需要有在线客服人员进行接待&#xff0c;及时的与访客进行沟通&#xff0c;才能留住访客&#xff0c;变流量为销量。 在线客服系统可以…

Vue框架学习笔记——指令语法:v-bind动态绑定属性、data的层级结构

文章目录 指令语法v-bind&#xff0c;增加标签内属性动态绑定方式 data的层级结构 指令语法 在标签中想让属性动态变化的时候&#xff0c;不能使用插值语法。 插值语法一般用于标签体中&#xff0c;当针对标签的里面的时候&#xff0c;例如标签属性&#xff0c;就可以使用指令…

捷报连连!怿星科技荣获北京市科学技术进步奖一等奖

近期&#xff0c;北京市科学技术委员会、中关村科技园区管理委员会揭晓了2022年北京市科学技术奖的获奖名单。其中&#xff0c;由清华大学牵头、怿星科技参与开发的《电动汽车底盘运动控制与能量管理关键技术及应用》项目荣获“北京市科学技术进步奖一等奖”。 作为北京市政府设…

销售团队可以借助CRM系统做什么?

销售主管都想有一支效率高、质量高的销售团队&#xff0c;无论对于初创企业还是大型企业销售团队都是企业盈利的主力部门&#xff0c;直接为企业带了业绩。如何提升销售团队水平&#xff1f;离不开CRM系统的辅助&#xff0c;CRM软件能为销售团队提供哪些支持&#xff1f;下面我…

什么样的企业可以使用免费版的CRM?

市面上大部分的免费CRM不需要付费即可使用&#xff0c;但是对于使用人数和功能进行了部分限制。下面我们就来说说&#xff0c;免费CRM的适用对象是谁&#xff1f; 1、初创/小微企业 这种小微企业没有太多的资金&#xff0c;也没有复杂的客户管理需求&#xff0c;仅仅需要一款…

智能井盖传感器建设信息化时代智慧城市

近年来随着信息技术的快速发展和城市化进程的加速推进&#xff0c;智慧城市的概念逐渐成为现实。作为智慧城市生命线建设中的重要组成部分&#xff0c;智能井盖传感器的应用正在为城市的可持续发展和居民的生活质量提供新的解决方案。 智能井盖传感器能够实时监测井盖状态&…

数据质量校验

1.事实表包含昨日数据 2.昨日同比趋势分析 圆通业务量较为平稳 &#xff0c;每日数据量和昨日比差距不足20%&#xff0c;会做数据量的昨日环比差距分析

汇编-MOVSXD64位带符号扩展传送

允许源操作数为32位的寄存器或内存操作数 ExitProcess PROTO .code main PROCmov ebx, 0FFFFFFFFh movsxd rax, ebx ;RAX FFFFFFFFFFFFFFFFhmov ebx, 01FFFFFFFh movsxd rdx, ebx ;RDX 000000001FFFFFFFhmov ecx,0 ;结束程序call ExitProcess main ENDP E…

洗衣行业在线预约小程序源码系统 附带完整的搭建教程

目前&#xff0c;人们对生活品质的追求不断提高&#xff0c;但生活节奏却也不断加快。对品质的追求遇到了忙碌的生活节奏&#xff0c;人们更渴望以最简单、便捷的方式达到追求品质的目的。同时&#xff0c;由于线上支付的普及&#xff0c;大家更希望足不出户就可以解决自己生活…

Windows本地搭建rtmp推流服务

前言 开发时偶尔需要使用rtmp直播流做视频流测试&#xff0c;苦于网上开源的rtmp视频流都已经失效&#xff0c;无奈只好尝试在本地自己搭建一个rtmp的推流服务&#xff0c;方便测试使用。 一、工具准备 Nginx&#xff1a;使用nginx-rtmp-win64推流工具FFmpeg&#xff1a;官方…

算法设计与分析算法实现——删数问题

通过棋盘输入一个高精度的正整数n(n的有效位数<=240)去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。变成对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。 输入:n,s 输出:最后剩下的最小数 输入实例: 178543 4 输出示例: 13 首先…

远程命令执行漏洞原理,以及防护绕过方式

一、背景 RCE(Remote Command /Code Execute) 远程代码执行漏洞 通过PHP代码注入、Java代码注入等方式连接程序中预留的后门或接口从而进行远程命令执行&#xff0c;达到对服务器的控制。 为什么会出现远程代码执行漏洞呢&#xff1f; Web应用有时需要调用执行一些系统命令函数…

PySide6 Tutorials (一)表格小部件魔改

前言 Pyside6官方教程给了一个使用表格显示颜色的教程&#xff0c;原教程地址如下&#xff1a;源地址&#xff0c; 结合前面button信号的学习&#xff0c;就魔改添加了如下功能&#xff1a;增加一列按钮&#xff0c;可以修改该行的颜色值&#xff0c;通过点击按钮生成指定的颜…

Vue中Slot的使用指南

目录 前言 什么是slot&#xff1f; 单个slot的使用 具名slot的使用 作用域插槽 总结 前言 在Vue中&#xff0c;slot是一种非常强大和灵活的功能&#xff0c;它允许你在组件模板中预留出一个或多个"插槽"&#xff0c;然后在使用这个组件的时候动态地填充内容。这…

.skip() 和 .only() 的使用

.skip() 和 .only() 的使用 说明 在做自动化测试中&#xff0c;跳过执行某些测试用例&#xff0c;或只运行某些指定的测试用例&#xff0c;这种情况是很常见的Cypress中也提供了这种功能 如何跳过测试用例 通过describe.skip() 或者 context.skip() 来跳过不需要执行的测试…