- 修改存入书的数量:增加和删除书籍时要用到
- 得到某本书:取书时要用到
- 修改某本书:新增书籍时要将新的书的信息录入
该包类即我们用户进行的操作,我个人设计了下面几个操作
新增、删除、查找、借阅、归还、显示所有书籍、退出系统
由于对于书架的操作我们其实就可以抽象的看成下面这样的函数
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);
}
}
上述具体操作其实就是你对一个顺序表进行一系列操作,当你去思考敲它们时,会发现是整个工程比较简单的一环
这个包里即我要构造的用户(管理员和普通用户),因此我先创建了父类 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;
}
}
==================================================================================
其实我个人在写代码时肯定不可能各各细节都一步到位,肯定是在大框架下边写边改。
而既然有了上述各包的代码,我们最终主类中怎么将他们整合呢?先直接上代码
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 的疑惑。
最后我们再根据得到的操作序号去执行对应都操作!
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。
此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!
给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”
且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
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)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!