IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> BookCollectionSoftware - 图书管理(知识点糅合::类,对象,抽象类,接口,封装,继承,多态,顺序表)- java - 细节狂魔 -> 正文阅读

[Java知识库]BookCollectionSoftware - 图书管理(知识点糅合::类,对象,抽象类,接口,封装,继承,多态,顺序表)- java - 细节狂魔

文章目录

前言

本文主要目的: 将前面的博客内容,做一个整合,
实现图书管理涉及的知识点:类,对象,抽象类,接口,封装,继承,多态,顺序表


?

图书管理应实现的功能

1. 输入用户名
2.是以什么身份登录(普通用户还是管理员)
3.普通用户选项菜单 && 管理员选项菜单
4.功能实现(普通用户和管理员菜单可操作的功能有所不同)
?4.1查找图书(普通用户 和 管理员)
?4.2新增图书(管理员)
?4.3删除图书(管理员)
?4.4显示图书(普通用户 和 管理员)
?4.5退出系统(普通用户 和 管理员)
?4.6借阅图书 (普通用户 )
?4.7归还图书(普通用户 )
5.隐藏功能(就是背地里完成的功能)
?5.1 存储数的信息
?5.2 书不止一本,所以该怎么存储.
?5.3 业务功能,就是说别人还书,借书的指引,或者提示什么的。


?

准备工作

在这里插入图片描述

开始操作

先在book包,创建一个Book类,用来存储一本书的信息

在这里插入图片描述


?

小技巧:

在这里插入图片描述
在这里插入图片描述

根据小技巧来创造我们的 构造方法,公开的输入输出的接口,,还要重写的toString方法

代码如下(轻轻松松70行代码):

public class Book {
    // 做项目的时候,成员变量几乎都是private修饰的,确保数据的安全性
    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/*Boolean isBorrowed*/) {// 构造方法
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
//        this.isBorrowed = isBorrowed; 这个没必要写,因为布尔类型的属性,默认值为false,意为没有被借出
    }
// 由于成员变量都是private修饰的,所以要提供公开的输入输出接口
    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 getBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(Boolean borrowed) {
        isBorrowed = borrowed;
    }
// 再来重写 toString 方法,让它按照我们想要额方式来输出
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }
}

?

在Book包里,再创建一个 BookList 用顺序表实现书架,

在这里插入图片描述


?

初步实现

public class BookList {
    private Book[] books = new Book[10];//初始书架空间为10本书
    private int usedSize;// 默认初始存储为 0

    // 假设默认存放四本书,通过调用构造方法来实现,
    public BookList(){
        books[0] = new Book("三国演义","罗贯中",40,"小说");
        books[1] = new Book("西游记","吴承恩",45,"小说");
        books[2] = new Book("水浒传","施耐庵",47,"小说");
        books[3] = new Book("红楼梦","曹雪芹",50,"小说");
        this.usedSize = 3;
    }
    // 获取当前书架上有几本书
    public int getUsedSize() {
        return usedSize;
    }
    // 在增删的时候,需要用到
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    // 一般图书馆的书,都是有编号的,假设书的编号 为 我们元素的下标
    // 输入编号,返回书籍信息
    public Book getPos(int pos){
        //考虑pos位置的合法性
        if (pos<0&&pos>usedSize){
            System.out.println("没有书籍的编号符合你的需求。");
            return null;
        }
        return  this.books[pos];
    }

}

?

接下来就是先那些功能,但是我不想 像 顺序表那样,把所有的操作都写在一起。我把这些操作过程都面向对象,

首先创建一个包用来 存储 操作类

在这里插入图片描述


现在我们就来初步实现它们

在这里插入图片描述

仔细想想,后面的所有操作都是对顺序表数据,进行操作的。
那么我们就把提取出来,作为接口。
在这里插入图片描述
这么做的目的,就是为了方便导入 普通用户,和 管理员的功能,我可以通过这个接口引用全部功能。
因为 管理员 和 普通用户所使用的功能是有所不同的,有了这个接口,我们可以自主选择,那些是 管理员的功能,那些是普通用户的功能


?

再来看 user 包,我们需要写什么

user 用户的意思,无论是管理员,还是普通用户,都是用户。
那么就意味着两者具有共性,我们将其提取出来。
在这里插入图片描述
再建立两个类,分别是普通用户类 和 管理员类
在这里插入图片描述
在这里插入图片描述


?

管理员菜单 && 普通用户菜单

在这里插入图片描述


?

菜单已建立好了,接下来。就需要调用一下,看下效果,

在这里插入图片描述
在这里插入图片描述


效果图

在这里插入图片描述
在这里插入图片描述


?

进入下一个阶段,既然现在已经能够打印出菜单。接下来就是 选择菜单中的功能,并将其使用。

那么就意味着我们需要回过头,再去看看 AdminUser 和 NormalUser 这两个用户类,补充其功能。
第一步: 修改用户包中的三个类的menu方法
在这里插入图片描述
在这里插入图片描述
先别着急,虽然改好菜单,但是如何将管理员 和 普通用户 的 菜单功能实现 是一个问题,
接下来看着我的操作,现在 User 父类中创建一个 IOperation 数组
在这里插入图片描述
然后重点来了,我们先拿 AdminUser 起手
在这里插入图片描述
再来看普通用户就简单了
在这里插入图片描述
接下来就是至关重要的一步,细品。在这里插入图片描述
简单来说:我们在 Uesr类中 创建一个doWork方法,来调用 其他功能类的方法,
?
通过 menu菜单的返回值(也就是用户选择的功能),
?
即IOperation 数组的元素下标,来选择相对应的功能对象,
?
根据 对象的引用,来调用其中方法,这也是为什么我们前面说 数组的元素,要对应菜单的顺序,是为了方便我们去调用它,
?
有些朋友可能基础不扎实,说,你都没有接收引用,你是怎么调用work方法的?
这里使用的是一次性对象(匿名对象)去访问的,课参考ClassAndObject -类与对象这篇博客,匿名对象的解释在导航最后,你可以通过点击导航,跳到那个位置去看,
?
而 User 中的 doWork 就是通过 匿名对象,去访问对象中的 work方法。,而work的工作形式,是由我们选择的对象所决定的,(多态)
多态不熟悉的朋友 可以参考 ObjectOrientedProgramming - 面向对象的编程(包、继承、多态的一部分:向下/向下转型,重写)ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口) 这两篇博客,这两篇博客只要认真看,肯定收获颇丰。


?

效果图

在这里插入图片描述
由图发现虽然结果是我们想要的,但是 程序的结束,不是我们想要的,
比如说, 管理员 使用查找书籍功能,是为了观察书架上的数的情况,好对其增删查改。
我们这程序,使用一次功能就退出系统,想进行其它操作,还得重登,重新选择,多麻烦。是不是?
所以我们要在 加一个循环 。
效果如下:
在这里插入图片描述
在这里插入图片描述
循环的退出,交给我们的退出系统功能。
这也是我们下一步需要做的,完善操作功能。


?

显示图书功能(完善操作功能)

// 显示操作
public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            Book book = bookList.getPos(i);// 换取书的信息
            System.out.println(book);
        }
    }
}

需做的一些修改

BookList 在这里插入图片描述


效果图

在这里插入图片描述


?

添加图书功能

添加图书
 默认放到最后一个位置
暂不考虑 书架满不满等其他业务实现,这里只是一个初步框架,有兴趣完善业务能力的,可以自行修改
import java.util.Scanner;
public class AddOperation implements IOperation{
        public void work(BookList bookList){
                System.out.println("新增图书");
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入图书名称:");
                String name = sc.nextLine();
                System.out.println("请输入图书的作者:");
                String author = sc.nextLine();
                System.out.println("请输入图书的类型:");
                String type = sc.nextLine();
                System.out.println("请输入图书的价格:");
                int price = sc.nextInt();
                // 得到了 书的属性,就可以new Book 传参了
                Book book = new Book(name,author,price,type);
                
                // 得到目前书的数量,数组你知道的,下标从0开始,最后一本的的下标是usedSize-1.
                // 那么我们只需 下标 为usedSize,增加就可以了
                int size = bookList.getUsedSize();
                bookList.setBook(size,book);
                
                // 添加完一本书,书的数量加一
                bookList.setUsedSize(size+1);
                
                System.out.println("添加成功");
              
        }
}

附图

在这里插入图片描述


?

前面有一个小瑕疵

这里应该是 false ,因为 布尔类型的默认值是 false。
但由于作者 前面写 String 类型,写顺手了,把 boolean 写成了封装类型 Boolean了。
在这里插入图片描述
在这里插入图片描述
当然这不是最主要的,我们的 isBoolean 使用用来表示书的 借出/归还 的状态。
解决也简单:修改 Book 重写的 toString 方法
在这里插入图片描述


?

查找图书功能

import java.util.Scanner;

// 查找图书
public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        Scanner sc = new Scanner(System.in);
        System.out.println("输入你要找的书籍名称:");
        String name = sc.nextLine();
        BookList bookList1 = new BookList();
        for (int i = 0; i < bookList1.getUsedSize(); i++) {
            Book book = bookList1.getPos(i);// 获取书籍信息
            if (name.equals(book.getName())){// 比较书名
                System.out.println("找到了,信息如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有你所搜索的书籍");
    }
}

效果图

在这里插入图片描述


?

退出功能

在这里插入图片描述


?

删除功能

import java.util.Scanner;

// 删除图书
public class DelOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        System.out.println("输入你要删除书籍的名字:");
        Scanner sc = new Scanner(System.in);
        String name  = sc.nextLine();
        // 寻找删除书籍
        int index = 0;// 用来存储删除元素的下标
        int i = 0;
        for (; i < bookList.getUsedSize(); i++) {
            Book book = bookList.getPos(i);
            if (name.equals(book.getName())){
                index = i;
                break;
            }
        }
        // 进行删除
        if (i< bookList.getUsedSize()){
            for (int j = 0; j < bookList.getUsedSize()-1; j++) {
//                bookList[j] = bookList[j+1] error 错误写法,现在的 bookList 是一个变量,不是数组
                Book book = bookList.getPos(j+1);
                bookList.setBook(j,book);
            }
            bookList.setBook(bookList.getUsedSize(), null);// 将最后一个重复的元素(引用),置为null.
            bookList.setUsedSize(bookList.getUsedSize()-1);// 删除了一个元素,元素个数减一。
            System.out.println("删除成功");
            return;
        }
        System.out.println("没有你要删除的书");
    }
}

效果图

在这里插入图片描述


?

借阅图书

import java.util.Scanner;

// 借阅图书
public class BorrowOperation implements IOperation{
    public void work(BookList bookList){
        System.out.println("借阅图书");
        System.out.println("请输入你想借阅的书籍名称:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            Book book = bookList.getPos(i);// 获取此时下标为i的书籍
            if (name.equals(book.getName())){// 通过书名寻找要删除的书籍
                if(book.getBorrowed() ==  true){// true 代表书籍被借出
                    System.out.println("你要借阅的书籍,已被借走。无法借阅。");
                    System.out.println("信息如下:");
                    System.out.println(book);
                    return;
                }
                // false 表示未借出,借出时,将 isBorrowed 置为true。表示借出成功
                book.setBorrowed(true);
                System.out.println("借阅成功!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有你要借阅的书籍");
    }
}

效果图

在这里插入图片描述


?

归还图书功能

import java.util.Scanner;

// 归还图书
public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("请输入你想借阅的书籍名称:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            Book book = bookList.getPos(i);
            if (name.equals(book.getName())){
                if(book.getBorrowed() ==  false){
                    System.out.println("你要归还的书籍,已归还。无法重复此操作。");
                    System.out.println("信息如下:");
                    System.out.println(book);
                    return;
                }
                // true 表示已借出,归还时,将 isBorrowed 置为false。表示归还成功
                book.setBorrowed(false);
                System.out.println("归还成功!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("你要归还的书籍,不属于本图书馆。");
    }
}

附图

在这里插入图片描述


?
在这里插入图片描述


?

至此,图书管理的全部功能已经全部实现。

最后附上 各类程序总图,本文结束。

包和类的分布图

在这里插入图片描述

Main(程序入口)

在这里插入图片描述


?

User (用户,父类)

在这里插入图片描述


?

AdminUser (用户 - 管理员-子类)

在这里插入图片描述


?

NormalUser (用户 - 普通用户 - 子类)

在这里插入图片描述


?

接口 IOperation

在这里插入图片描述


?

AddOperation(添加图书)

在这里插入图片描述


?

BorrowOperation (借阅图书)

在这里插入图片描述


?

DelOperation(删除图书)

在这里插入图片描述


?

DisplayOperation (显示书籍)

在这里插入图片描述


?

ExitOperation (退出系统)

在这里插入图片描述


?

FindOperation(查找图书)

在这里插入图片描述


?

ReturnOperation (归还书籍)

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:30:07  更:2021-11-19 17:30:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:37:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码