图书管理系统

news2024/11/24 0:08:15

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

文章目录

目录

文章目录

前言

一.界面设计

1.管理员菜单

2.用户菜单

3.用户操作:

  • 查找图书
  • 借阅图书
  • 归还图书
  • 显示图书

4.管理员操作

  • 查找图书
  • 新增图书
  • 删除图书

二. Book包

1.book类

 

2.booklist类

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

四.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='小说', 未借出}

 

管理员菜单

用户菜单

用户操作:

查找图书

借阅图书

归还图书

显示图书

见界面设计处

管理员操作

查找图书

新增图书

类似于用户的新增图书

删除图书

类似于用户删除图书


 Book包

book类

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{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }
}

booklist类

package 图书管理系统.book;

import 图书管理系统.book.Book;

public class BookList {
    private Book[] books = new Book[10];
    private int usdSize;

    public BookList() {
        books[0]=new Book("三国演义","罗贯中",42,"小说");
        books[1]=new Book("红楼梦","曹雪芹",50,"小说");
        books[2]=new Book("西游记","吴承恩",58,"小说");
        books[3]=new Book("水浒传","施耐庵",40,"小说");
        this.usdSize=4;
    }
    //修改图书数量
    public void setUsdSize(int usdSize){
        this.usdSize=usdSize;
    }
    //获得图书数量
    public int getUsdSize(){
        return usdSize;
    }
    //放书
    public void setBook(int pos,Book book){
        books[pos]=book;
    }
    //取书
    public Book getBook(int pos){
        return books[pos];
    }

}

接口和实现类的操作包

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

public interface IOperation {
    public abstract void work(BookList bookList);
}

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

具体实现类见下文:

User包

package User;

import operation.IOperation;
import 图书管理系统.book.BookList;

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);
    }
}

NormalUser类

package User;

import operation.*;

import java.util.Scanner;

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("hello "+name+" 欢迎来到图书小练习");
        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);
        int choice=scanner.nextInt();
        return choice;
    }
}

AdminUser类

package User;

import operation.*;

import java.util.Scanner;

public class AdminUser extends User{
    public AdminUser(String name){
        super(name);
        this.iOperations=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DeleteOperation(),
                new DisplayOperation()
        };
    }
    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 sc=new Scanner(System.in);
        int n=sc.nextInt();
        return n;
    }
}

最难的整合

Main类

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

 

import User.AdminUser;
import User.NormalUser;
import User.User;
import 图书管理系统.book.BookList;

import java.util.Scanner;


public class Main {
    //动态绑定
    public static User login(){//登陆 发生了向上转型
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入你的姓名");
        String name=sc.nextLine();
        System.out.println("请输入你的身份:1:-》管理员,0-》普通用户");
        int choice=sc.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();
            user.doOperation(choice, bookList);
        }
    }
}

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

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

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

相关文章

【Matlab】Matlab导入多个.mat文件并画图的过程详解

Matlab导入多个.mat文件并画图的过程详解0. 实验背景1. 导入.mat文件存储1.1 导入.mat文件及作图最简单的方式:1.2 导入.mat文件及作图的脚本代码2. plot画图总结2.1 画散点图2.1.1 点形状2.1.2 点大小2.1.3 点颜色2.1.4 点填充2.2 画折线图2.2.1 折线形状2.2.2 折线…

多路转接(IO复用)接口介绍

文章目录引言select函数声明参数以及类型介绍返回值select代码演示优缺点poll函数声明参数以及类型介绍返回值poll代码演示优缺点epollepoll三调用简述epoll实现原理epoll代码演示epoll工作方式对比LT和ET注意点引言 此文仅仅作为多路转接api的介绍和使用,而对于五种IO模型的介…

闲活章始:初创纪元

OK先说好,标题沙雕的原因是因为要求不少于5个字 不打算提炼语言了,浓缩表达是个费事活。既然文章归为闲活,其中也来些闲话较好。主要给自己看,能帮助他人更妙。 待闲活干好之日,就是文章收费之时。 做什么 做…

(JVM)运行时数据区的总结以及常见大厂面试题

运行时数据区的总结以及常见大厂面试题 线程私有的:程序计数器、本地方法栈、虚拟机栈 虚拟机栈里的栈帧的结构:返回值、局部变量表、操作数栈、动态链接(装着指向运行时常量池的当前方法的引用,知道当前方法是引用运行时常量池中…

中国制造2025-智能制造是强国必由之路

《中国制造2025》十大重点领域 新一代信息技术产业:集成电路及专用设备、信息通信设备、操作系统与工业软件、智能制造核心技术信息设备 高档数控机床和机器人:高档数控机床与基础制造装备、机器人 航空航天装备:飞机、航空发动机、航空机载设备与系统…

软件测试---前言篇

一 : 主要内容 二 : 什么是软件测试 在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程.上面这是官话 . 在我们日常生活中 , 就有许多测试的行为 , 比如地铁站的金属检测仪 , 用于检测旅客…

【SpringBoot笔记26】SpringBoot框架集成ElasticSearch数据库

这篇文章,主要介绍SpringBoot框架如何集成ElasticSearch数据库。 目录 一、SpringBoot集成ES 1.1、ElasticSearch介绍 1.2、引入ES依赖 1.3、实例化ES对象 1.4、创建测试控制器 一、SpringBoot集成ES 1.1、ElasticSearch介绍 ElasticSearch是一款分布式&…

[附源码]java毕业设计网上购物商城系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Allegro只给孔或pin加背钻属性操作指导

Allegro只给孔或pin加背钻属性操作指导 Allegro支持只给孔加背钻属性,除了孔,pin也是可以的,具体操作步骤如下 选择Edit-Property命令 Find选择Net 选择需要背钻的网络添加背钻属性,点击OK 设置下背钻参数 选择背钻种类,top钻选择top,bottom钻选择bottom 把需要背钻…

科研笔记—Ergodic Rate Analysis of STAR-RIS Aided NOMA Systems

Ergodic Rate Analysis of STAR-RIS Aided NOMA Systems 1 STAR-RIS2 摘要3 系统模型3.1 信道3.2 用户位置3.3 ES(Energy Splitting)能量分裂协议3.4 NOMA3.5 信道模型3.6 信干噪比4 仿真4.1 遍历率分析星型智能反射面辅助NOMA系统的遍历率分析 原文链接…

Day08--初步创建并使用自定义组件

提纲挈领: 1.如何创建自定义组件? 我的操作: ************************************************* ************************************************* ************************************************* *****************************…

Netty:入门(2)

相关文章: 《IO 模型与多路复用》 《Java NIO》 《Netty:入门(1)》 写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。 前言 在前文中,我们…

Spring 中 Bean 对象的存储和取出

由于 Spring 拥有对象的管理权,所以我们也需要拥有较为高效的对象存储和取出的手段,下面我们来分别总结一下: 存对象 配置文件 在存储对象之前,我们需要先配置一下 Spring 的扫描目录,这样 Spring 即可在正确的目录…

JVM复习【面试】

JVM复习【面试】前言推荐复习【JVM】第一部分 走进Java第1章 走进Java /2第二部分 自动内存管理机制第2章 Java内存区域与内存溢出异常 /382.2 运行时数据区 /382.2.2 Java虚拟机栈 /392.3 HotSpot虚拟机对象探秘2.3.1 对象的创建 /442.3.2 对象的内存布局 /472.4 实战&#xf…

HTML-Demo:工商银行电子汇款单

HTML-Demo:工商银行电子汇款单 Date: November 20, 2022 Demo简介: 简要说明一下这个demo 用HTML完成以下表格 知识点简介: 简要介绍其中一些知识点 表格属性 cellspacing 与 cellpadding 功能: cellpadding和cellspacing属性控…

面试:java中的各种锁对比

共享锁 共享锁有CountDownLatch, CyclicBarrier, Semaphore, ReentrantReadWriteLock等 ReadWriteLock,顾名思义,是读写锁。它维护了一对相关的锁 — — “读取锁”和“写入锁”,一个用于读取操作,另一个用于写入操作。“读取锁…

D. Make It Round(贪心 贡献 数学)[Codeforces Round #834 (Div. 3)]

题目如下: 思路 or 题解: 我们先考虑如何操作使结尾有最多的 0 我们不难发现: 2 * 5 10 10 10 我们是否只需要考虑 2 与 5 的贡献就行了 答案是肯定的!!! 约定: cnt5因数5的个数cnt_5 因数 …

kubernetes集群安装Ingress-nginx

文章目录概述搭建环境版本对应关系yaml文件安装实操演示常见问题外链地址概述 Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。 Kubernetes 通过 kube-proxy 服务实现了 Service 的对外发布及负载均衡,它的各…

2.3、传输方式

2.3、传输方式 2.3.1、串行&并行 2.3.3.1、串行传输 串行传输是指数据是一个比特一个比特依次发送的。因此,在发送端与接收端之间只需要一条数据传输线路即可 2.3.3.2、并行传输 一次发送 nnn 个比特。为此,在发送端和接收端之间需要有 nnn 条传输…

解决vscode各种异常格式化编译器配置

在vscode中创建vue文件时,若编辑代码时会出现间隔一段时间后自动的格式化内容,会很烦,经反复改查后无果,后来,对编辑器进行全面配置 首先原setting.json文件中的代码是这样的 { "files.autoSave": &qu…