【Java 基础语法】纯 Java《图书管理系统》练习

  • 修改存入书的数量:增加和删除书籍时要用到
  • 得到某本书:取书时要用到
  • 修改某本书:新增书籍时要将新的书的信息录入

2.2 对于书架的操作(operation 包)


该包类即我们用户进行的操作,我个人设计了下面几个操作

新增、删除、查找、借阅、归还、显示所有书籍、退出系统

由于对于书架的操作我们其实就可以抽象的看成下面这样的函数

public void work(BookList bookList);

所以我们先看下接口的代码

2.2.1 操作接口

public interface IOperation {

public void work(BookList bookList);

}

这里其实就用到了接口和抽象类

接着我们再通过各种操作去继承接口,并完善各自的内容

2.2.2 新增书籍

public class AddOperation implements IOperation{

@Override

public void work(BookList bookList) {

if(bookList.getSize()==10){

System.out.println(“书库已满,无法增加书籍”);

return;

}

Scanner reader = new Scanner(System.in);

String name;

String author;

int price;

String type;

System.out.print(“请输入你要新增的书名:”);

name=reader.nextLine();

System.out.print(“请输入该书的作者:”);

author=reader.nextLine();

System.out.print(“请输入该书的价格:”);

price=reader.nextInt();

reader.nextLine();

System.out.print(“请输入该书的类型:”);

type=reader.nextLine();

int pos=bookList.getSize();

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

bookList.setBooks(pos, book);

bookList.setSize(bookList.getSize()+1);

}

}

2.2.3 删除书籍

public class DelOperation implements IOperation{

@Override

public void work(BookList bookList) {

if(bookList.getSize()==0){

System.out.println(“书库无书,无法进行删除操作”);

return;

}

Scanner reader = new Scanner(System.in);

String name;

System.out.print(“请输入你要删除的书名:”);

name=reader.nextLine();

for(int i=0;i<bookList.getSize();i++){

if(name.equals(bookList.getBook(i).getName())){

while(bookList.getSize()-i-1!=0){

bookList.setBooks(i,bookList.getBook(i+1));

i++;

}

bookList.setSize(bookList.getSize()-1);

return;

}

}

System.out.println(“书库无该图书,无法进行删除操作”);

}

}

2.2.4 查找书籍

public class FindOperation implements IOperation{

@Override

public void work(BookList bookList) {

if(bookList.getSize()==0){

System.out.println(“书库无书”);

return;

}

Scanner reader = new Scanner(System.in);

String name;

System.out.print(“请输入你要查找的书名:”);

name=reader.nextLine();

for(int i=0;i<bookList.getSize();i++){

if(name.equals(bookList.getBook(i).getName())){

System.out.println(“已查询找到该书,信息如下:”);

System.out.println(bookList.getBook(i));

return;

}

}

System.out.println(“未查询到该书”);

}

}

2.2.5 借阅书籍

public class LendOperation implements IOperation{

@Override

public void work(BookList bookList) {

if(bookList.getSize()==0){

System.out.println(“书库无书,无法进行借阅”);

return;

}

Scanner reader = new Scanner(System.in);

String name;

System.out.print(“请输入你要借阅的书名:”);

name=reader.nextLine();

for(int i=0;i<bookList.getSize();i++){

if(name.equals(bookList.getBook(i).getName())){

if(bookList.getBook(i).isLent()==false) {

bookList.getBook(i).setLent(true);

System.out.println(“借阅成功”);

}else{

System.out.println(“该书已被他人借阅,借阅失败”);

}

return;

}

}

System.out.println(“未查询到该书,借阅失败”);

}

}

2.2.6 归还书籍

public class ReturnOperation implements IOperation{

@Override

public void work(BookList bookList) {

Scanner reader = new Scanner(System.in);

String name;

System.out.print(“请输入你要归还的书名:”);

name=reader.nextLine();

for (int i =0;i<bookList.getSize();i++){

if(name.equals(bookList.getBook(i).getName())){

if(bookList.getBook(i).isLent()==true){

bookList.getBook(i).setLent(false);

System.out.println(“该书归还成功”);

return;

}else{

System.out.println(“该书未被借阅,操作错误”);

return;

}

}

}

System.out.println(“未查询到你要归还的书籍,操作错误”);

}

}

2.2.7 显示所有书籍信息

public class DisplayOperation implements IOperation{

@Override

public void work(BookList bookList) {

if(bookList.getSize()==0){

System.out.println(“书库无书”);

}

for(int i=0;i<bookList.getSize();i++){

System.out.println(bookList.getBook(i));

}

}

}

2.2.8 退出系统

public class ExitOperation implements IOperation{

@Override

public void work(BookList bookList) {

System.out.println(“图书管理系统已退出,欢迎下次使用!”);

System.exit(0);

}

}

上述具体操作其实就是你对一个顺序表进行一系列操作,当你去思考敲它们时,会发现是整个工程比较简单的一环

2.3 用户(user 包)


这个包里即我要构造的用户(管理员和普通用户),因此我先创建了父类 User。那么一个用户的基本信息有什么呢?

  • 用户名
  • 菜单:我们假想当我们去 ATM 机取钱时,我们可以看到一个界面
  • 用户要进行的操作

那么我们先看我的代码吧!

2.3.1 User 类

abstract public class User {

protected String name;

protected IOperation[] iOperations;

public User(String name) {

this.name = name;

}

abstract public int menu();

public void doOperation(int choice, BookList bookList){

iOperations[choice].work(bookList);

}

}

此时你会发现除了用户名的定义,其他属性和行为都有点细节问题需要思考

  • 菜单:因为普通用户和管理员的菜单是不同的,而我们不需要父类去实现具体的代码,所以我修改成了抽象类
  • 用户要进行的操作:其实整合框架的时候才很容易理解上述代码中的
protected IOperation[] iOperations;
public void doOperation(int choice, BookList bookList){
    iOperations[choice].work(bookList);
}
因为我们是需要用户去进行这些操作,而我个人针对普通用户和管理员设计成的界面其实如下图![在这里插入图片描述](https://img-blog.csdnimg.cn/7c7da9390b424f20ae2e6183685dd08f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ZCe5ZCe5ZCQ5ZCQ5aSn6a2U546L,size_12,color_FFFFFF,t_70,g_se,x_16#pic_center)
所以我先创建了一个操作的数组,注意此时我没有创建对象,因为普通用户和管理员的对象(即操作)是不同的,看上述菜单就知道。之后构造了一个方法(即用户用来调用操作的),将对应操作的序号,以及要操作的对象传进去,就可以实现这些操作的使用

那么现在对于管理员和普通用户的定义也很简单了,即要将菜单和操作数组的对象进行修改

2.3.2 AdminUser 类

public class AdminUser extends User{

public AdminUser(String name){

super(name);

this.iOperations = new IOperation[]{new ExitOperation(), new FindOperation(), new AddOperation(), new DelOperation(), new DisplayOperation()};

}

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.print(“请输入您要执行的操作序号:”);

Scanner reader = new Scanner(System.in);

int index = reader.nextInt();

return index;

}

}

2.3.3 NormalUser 类

public class NormalUser extends User{

public NormalUser(String name){

super(name);

this.iOperations = new IOperation[]{new ExitOperation(), new FindOperation(), new LendOperation(), 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.print(“请输入您要执行的操作序号:”);

Scanner reader = new Scanner(System.in);

int index = reader.nextInt();

return index;

}

}

4. 整合代码(含主类代码)

==================================================================================

其实我个人在写代码时肯定不可能各各细节都一步到位,肯定是在大框架下边写边改。

而既然有了上述各包的代码,我们最终主类中怎么将他们整合呢?先直接上代码

public class Main {

public static User login(){

System.out.println(“========= 图书管理系统 =========”);

System.out.print(“请输入您的姓名:”);

Scanner reader = new Scanner(System.in);

String name = reader.nextLine();

System.out.println(“欢迎 " + name + " 登录系统”);

System.out.println(“请问您是管理员(0),还是普通用户(1):”);

int choice = reader.nextInt();

if(choice==0){

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.doOperation(choice, bookList);

}

}

}

我们先看主方法,书架是涵盖这个图书系统所有书的一个仓库,所以我们肯定要先构造出来。

假设我们去银行取钱,那么这个书架就相当于我们这先建了一个银行。那么我们来到 ATM 机前,紧接着就是插卡登录嘛,所以我们图书管理系统也一样,我们要搞一个登录的样式,即我创建了一个 login 方法。代码很容易看懂,该方法的的返回值就是用户(这里用到了多态、动态绑定的思想)

而登录之后就会出现一个用户的菜单界面,也就是上述代码的 menu,也是这我们就可以理解,为什么用户菜单中的代码最后要我们输入执行的操作序号,以及返回值是 int 的疑惑。

最后我们再根据得到的操作序号去执行对应都操作!

5. 总结

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。

此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!

给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

image

且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
sdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

总结

面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。

此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!

给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

[外链图片转存中…(img-mtX0Wqj1-1713524579815)]

且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。

[外链图片转存中…(img-TuMSF4JO-1713524579817)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值