【JavaSE】JavaSE小练习 —— 图书管理系统
- 一、系统功能
- 二、涉及的知识点
- 三、业务逻辑
- 四、代码实现
- 4.1 book 包
- 4.2 user 包
- 4.3 Main 类
- 4.4 完善管理员菜单和普通用户菜单
- 4.5 接着4.4的管理员菜单和普通用户菜单,进行操作选择(1查找图书、2借阅图书.....)
- 4.6 operation 包
- 4.7 剩下的操作应该也按照此流程,那怎么实现分类呢(把5个操作分给管理员,4个操作分给普通用户)?
- 4.8 管理员的操作写完了,接下来是普通用户的操作:
- 4.9 接下来实现具体业务:
- 4.9.1 普通用户的具体业务实现 :
- 4.9.2 管理员的具体业务实现 :新增图书、删除图书、显示图书
一、系统功能
- 输入用户名
- 是以什么身份登录(普通用户 or 管理员)
- 普通用户选项菜单 && 管理员选项菜单
- 功能实现(普通用户和管理员菜单可操作的功能有所不同)
4.1 查找图书(普通用户 和 管理员)
4.2 新增图书(管理员)
4.3 删除图书(管理员)
4.4 显示图书(普通用户 和 管理员)
4.5 退出系统(普通用户 和 管理员)
4.6 借阅图书 (普通用户 )
4.7 归还图书(普通用户 ) - 隐藏功能(就是背地里完成的功能)
5.1 存储数的信息
5.2 书不止一本,所以该怎么存储?
5.3 业务功能,就是说别人还书,借书的指引,或者提示什么的。
二、涉及的知识点
- 基础语法:数据类型、数组、方法
- 类和对象
- 继承和多态
- 抽象类和接口
三、业务逻辑
- 找对象 --> 创建对象 --> 使用对象
- 抽象出来的对象:
书 / 书架
用户 :分为管理员 / 普通用户 - 这些操作,需要分类:
哪些是管理员的?哪些是普通用户的?
怎么分类?
四、代码实现
4.1 book 包
- Book类
在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的toString方法。
package book;
//书籍对象
public class Book {
private String name;//书籍名称
private String author;//作者
private int price;//书籍价格
private String type;//类型
private boolean isBorrowed;//是否被借出
//构造方法: 除了isBorrowed,new一本书籍,默认书未被借出 -- boolean类型,未被初始化,默认是false
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
//因为前面的成员变量是private,需要提供get()和set()方法
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;
}
//toString()方法
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
}
- BookList类
这里我们需要实现的有可以存放很多Book的数组,可以与增加、删除等功能的对应方法。
package book;
//书架
public class BookList {
private Book[] books;//存放书籍
private static final int DEFAULT_SIZE = 10;
private int usedSize;//书架上 原有有效书籍的个数
public BookList() {
this.books = new Book[DEFAULT_SIZE];
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
//还有待补充的.....
}
4.2 user 包
user 用户的意思,无论是管理员,还是普通用户,都是用户。那么就意味着两者具有共性,我们将其提取出来。
- User 类
package user;
public abstract class User {
public String name;
public User(String name) {
this.name = name;
}
public abstract void menu();//普通用户 或者 管理员,可以重写菜单
//可先不实现,所以写成 抽象类
}
- NormalUser 类
package user;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
}
@Override
public void menu() {
System.out.println("普通用户菜单.....");
}
}
- AdminUser 类
package user;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
}
@Override
public void menu() {
System.out.println("管理员菜单....");
}
}
4.3 Main 类
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){//运行的时候 登录
Scanner scanner = new Scanner(System.in);
System.out.println("请输入姓名:");
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) {
User user = login();
user.menu();
}
}
运行Main:
输入1,管理员菜单;输入2,普通用户菜单。
总结:
(1)向上转型
(2)动态绑定
4.4 完善管理员菜单和普通用户菜单
//管理员菜单
package user;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
}
@Override
public void menu() {
System.out.println(" 欢迎 "+ this.name+" 来到图书管理系统!");
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("*****************************");
System.out.println("请输入你的操作:");
}
}
//普通用户菜单
package user;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
}
@Override
public void menu() {
System.out.println(" 欢迎"+ this.name+" 来到图书管理系统!");
System.out.println("**********普通用户菜单**********");
System.out.println("1: 查找图书");
System.out.println("2: 借阅图书");
System.out.println("3: 归还图书");
System.out.println("0: 退出系统");
System.out.println("*****************************");
System.out.println("请输入你的操作:");
}
}
运行Main:
4.5 接着4.4的管理员菜单和普通用户菜单,进行操作选择(1查找图书、2借阅图书…)
- AdminUser 类
package user;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
}
@Override
public int menu() {
System.out.println(" 欢迎 "+ this.name+" 来到图书管理系统!");
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("*****************************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
- NormalUser 类
package user;
import operation.IOperation;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.iOperations = new IOperation[]{
};
}
@Override
public int menu() {
System.out.println(" 欢迎"+ this.name+" 来到图书管理系统!");
System.out.println("**********普通用户菜单**********");
System.out.println("1: 查找图书");
System.out.println("2: 借阅图书");
System.out.println("3: 归还图书");
System.out.println("0: 退出系统");
System.out.println("*****************************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
- User 类
package user;
public abstract class User {
public String name;
public User(String name) {
this.name = name;
}
public abstract int menu();//普通用户 或者 管理员,可以重写菜单
//可先不实现,所以写成 抽象类
}
- Main类
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){//运行的时候 登录
Scanner scanner = new Scanner(System.in);
System.out.println("请输入姓名:");
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) {
User user = login();
int choice = user.menu();
}
}
4.6 operation 包
- FindBook
package operation;
import book.Book;
public class FindBook {
@Override
public void work(Book[] books) {
System.out.println("查找图书.....");
}
}
- AddBook
package operation;
import book.Book;
public class AddBook {
@Override
public void work(Book[] books) {
System.out.println("新增图书.....");
}
}
4.7 剩下的操作应该也按照此流程,那怎么实现分类呢(把5个操作分给管理员,4个操作分给普通用户)?
这些操作放在一起,需要一个统一类型的数组 – (接口)。
- IOPeration接口
package operation;
import book.Book;
public interface IOperation {
void work(Book[] books);
}
所以上面的操作需要继承IOperation接口,重写work()方法
- 修改后的FindBook
package operation;
import book.Book;
public class FindBook implements IOperation{
@Override
public void work(Book[] books) {
System.out.println("查找图书.....");
}
}
- 修改后的AddBook
package operation;
import book.Book;
public class FindBook implements IOperation{
@Override
public void work(Book[] books) {
System.out.println("查找图书.....");
}
}
- DelBook
package operation;
import book.Book;
public class DelBook implements IOperation{
@Override
public void work(Book[] books) {
System.out.println("删除图书.....");
}
}
- ShowBook
package operation;
import book.Book;
public class ShowBook implements IOperation{
@Override
public void work(Book[] books) {
System.out.println("打印图书.....");
}
}
- ExitBook
package operation;
import book.Book;
public class ExitBook implements IOperation{
@Override
public void work(Book[] books) {
System.out.println("退出系统......");
}
}
4.8 管理员的操作写完了,接下来是普通用户的操作:
查找图书和退出系统已经有了,还剩下借阅图书、归还图书操作。
- BorrowedBook
public class BorrowedBook implements IOperation{
@Override
public void work(Book[] books) {
System.out.println("借阅图书.....");
}
}
ReturnBook
public class ReturnBook implements IOperation{
@Override
public void work(Book[] books) {
System.out.println("归还图书....");
}
}
所以的类都实现了IOPeration接口,意味着这个接口可以放 所以类的对象,但是还没有分开管理员和普通用户的操作,那么怎么分开?
给User 类定义成员变量,
因为AdminUser和NormalUser继承了User,只需要在AdminUser和NormalUser 中对IOperation进行指定类型的初始化,就可以将 管理员对应的操作 和 普通用户对应的操作 分开。
- 修改的User类
public abstract class User {
public String name;
public IOperation[] iOperations;//未被初始化
public User(String name) {
this.name = name;
}
public abstract int menu();
}
- 修改后的AdminUser类
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitBook(),
new BorrowedBook(),
new ReturnBook(),
};
}
@Override
public int menu() {
System.out.println(" 欢迎"+ this.name+" 来到图书管理系统!");
System.out.println("**********普通用户菜单**********");
System.out.println("1: 查找图书");
System.out.println("2: 借阅图书");
System.out.println("3: 归还图书");
System.out.println("0: 退出系统");
System.out.println("*****************************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
- 修改后的AdminUser类
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitBook(),
new FindBook(),
new AddBook(),
new DelBook(),
new ShowBook()
};
}
@Override
public int menu() {
System.out.println(" 欢迎 "+ this.name+" 来到图书管理系统!");
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("*****************************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
根据choice选择管理员/普通用户对应菜单的选择,即操作IOperation数组:
在User类中定义操作IOperation的方法。
- User类
package user;
import book.Book;
import book.BookList;
import operation.IOperation;
public abstract class User {
public String name;
public IOperation[] iOperations;//未被初始化
public User(String name) {
this.name = name;
}
public abstract int menu();
public void doiOperations(int choice, BookList books){
//在Normal菜单中选择3,根据choice来
// 操作NoramlUser的IOperation[]数组
IOperation iOperation = this.iOperations[choice];
//向上转型
iOperation.work(books);
}
}
- Main类
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import book.BookList;
import java.util.Scanner;
public class Main {
public static User login(){//运行的时候 登录
Scanner scanner = new Scanner(System.in);
System.out.println("请输入姓名:");
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 = login();
int choice = user.menu();
user.doiOperations(choice,bookList);
}
}
4.9 接下来实现具体业务:
4.9.1 普通用户的具体业务实现 :
查找图书 - > 根据书名查找
- BookList
package book;
//书架
public class BookList {
private Book[] books;//存放书籍
private static final int DEFAULT_SIZE = 10;
private int usedSize;//书架上 原有有效书籍的个数
public BookList() {
this.books = new Book[DEFAULT_SIZE];
//预先存3本书
this.books[0] = new Book("三国演义","罗贯中",20,"武侠小说");
this.books[1] = new Book("西游记","吴承恩",28,"神话小说");
this.books[2] = new Book("红楼梦","曹雪芹",15,"小说");
this.usedSize = 3;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
//还有待补充的.....
public Book getBook(int pos){//下标pos
return books[pos];
}
public void setBooks(int pos,Book book){
books[pos] = book;
}
}
- FindBook实现
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindBook implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("查找图书.....");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要查找的图书的名字:");
String name = scanner.nextLine();
//查找图书:遍历BookList的books数组,看看每一本书的name和输入的是否一样
//1.确定当前数组中,有效的书籍个数
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("没有你要找的书籍");
}
}
- ExitBook
package operation;
import book.Book;
import book.BookList;
public class ExitBook implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统......");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {//退出系统,需要把指向的对象回收
//bookList[i] = null;
bookList.setBooks(i,null);
}
bookList.setUsedSize(0);
System.exit(0);//0表示正常退出
}
}
- BorrowedBook
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowedBook implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书.....");
System.out.println("请输入你要借阅的图书:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
//1.先遍历数组 查找是否存在要借阅的图书
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
//2.如果存在 检查 是否已经被借出
if(book.isBorrowed()){
System.out.println("这本书已经被借出了!");
}else{
//3.如果不存在 则不能借阅
book.setBorrowed(true);
System.out.println(book);
System.out.println("借阅成功");
}
return;
}
}
//4. 如果没有借出 可以借阅;否则 不能借阅
System.out.println("没有你要找的这本书,无法借阅!");
}
}
- ReturnBook 归还图书
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnBook implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("归还图书....");
System.out.println("请输入你要归还的图书:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
//1.先遍历数组 查找是否存在要归还的图书
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
//2.如果没有被借出 则不用归还
if(!book.isBorrowed()){
System.out.println("这本书没有被借出过,不用还!");
}else{
//3.否则 归还 显示归还成功
System.out.println("归还成功");
System.out.println(book);
book.setBorrowed(false);
}
return;
}
}
//4. 没有要找的图书 无法归还
System.out.println("没有你要找的这本书,无法归还!");
}
}
- Book
package book;
//书籍对象
public class Book {
private String name;//书籍名称
private String author;//作者
private int price;//书籍价格
private String type;//类型
private boolean isBorrowed;//是否被借出
//构造方法: 除了isBorrowed,new一本书籍,默认书未被借出 -- boolean类型,未被初始化,默认是false
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
//因为前面的成员变量是private,需要提供get()和set()方法
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;
}
//toString()方法
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
(isBorrowed == true ? " , 已借出 ": " , 未借出 ")+
//", isBorrowed=" + isBorrowed +
'}';
}
}
4.9.2 管理员的具体业务实现 :新增图书、删除图书、显示图书
- 新增图书 AddBook
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddBook implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("新增图书.....");
/*
//扩容
if(isFull(bookList)){
System.out.println("书架满了....");
}
*/
/* if(isFull(bookList)){
//扩容的代码
//arrays.copyof()
}*/
//1.整理书籍信息
//新增的图书 实际上 是一个一个的图书对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入书籍的名称:");
String name = scanner.nextLine();
System.out.println("请输入书籍的作者:");
String author = scanner.nextLine();
System.out.println("请输入书籍的价格:");
int price = scanner.nextInt();
scanner.next();
System.out.println("请输入书籍的类型:");
String type = scanner.nextLine();//nextLine会读取空格
//next遇到空格 结束
Book book = new Book(name,author,price,type);
//放到书籍 数组里
//2.如果书架上有这本书 则不能上架
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book tmp = bookList.getBook(i);
if(tmp.getName().equals(name)){
System.out.println("有这本书,可以不上架!");
return;
}
}
//3.没有这本书 则放到书籍数组当中
bookList.setBooks(currentSize,book);
bookList.setUsedSize(currentSize+1);
}
//判断书架的书 是否摆满
private boolean isFull(BookList bookList){
return bookList.getbooks().length == bookList.getUsedSize();
}
}
- 显示图书ShowBook
package operation;
import book.Book;
import book.BookList;
public class ShowBook implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("打印图书.....");
//如果书架上有这本书 就展示书籍
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book tmp = bookList.getBook(i);
System.out.println(tmp);
}
}
}
- 删除图书DelBook
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelBook implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("删除图书.....");
Scanner scanner = new Scanner(System.in);
//1.输入你要删除的书籍名称
System.out.println("请输入要删除的书籍名称:");
String name = scanner.nextLine();
//2.查看当前书籍是否存在
int index = -1;
int i = 0;
int currentSize = bookList.getUsedSize();
for ( i = 0; i < currentSize; i++) {
Book tmp = bookList.getBook(i);
if(tmp.getName().equals(name)){
index = i;
break;
}
}
//没有遇到break
if(i >= currentSize){
System.out.println("没有你要删除的书籍....");
}
//遇到breaK:此时开始真正删除
for (int j = index; j < currentSize-1; j++) {
//bookList[j] = bookList[j+1];
Book tmp = bookList.getBook(j+1);
bookList.setBooks(j,tmp);
}
//修改usedSize的值,清空内存
bookList.setUsedSize(currentSize-1);
bookList.setBooks(currentSize-1,null);
}
}
💖💖💖
最后附上 图书管理系统码云链接