java基础学习后适合写的测试语法和代码熟练度的小项目(学校学java,总得练一练的)
文章目录
- 架构 / 流程
- 架构
- 流程
- 具体内容
- 代码实现
- books
- Book(图书类)
- BookList(图书列表类)
- user
- User(用户抽象类)
- AdminUser(管理员用户)
- NormalUser(普通用户)
- Main类
- operations
- IOperation(操作接口)
- ExitOperation(退出系统)
- 操作运行过程
- AddOperation(新增图书)
- DelOperation(删除图书)
- DisplayOperation(显示图书)
- BorrowOperation(借阅图书)
- ReturnOperation(归还图书)
- FindOperation(查找图书)
- 完整代码
架构 / 流程
架构
图书管理系统一共包含了以下部分:
- 实体类: 主要包括 图书类(Book) 和 图书列表类(BookList) 。其中,Book 包含了书名、作者和价格等属性;而 BookList 则封装了一个数组,用于存储多个 Book 对象。
- 操作接口:主要包括图书管理系统中各种操作的接口 (IOperation) ,如查找图书、借出图书、归还图书等。这个接口定义了一个 work() 方法,来执行对应的操作。
- 操作实现类: 主要包括了上述操作接口的实现类,下文会进行列举。这些实现类都实现了 IOperation 接口,并重写了 work() 方法,以实现对应的图书管理操作。
- 用户类: 主要包括一个 抽象类 User 类(以及AdminUser, NormalUser) ,用于模拟用户在图书管理系统中进行的各种操作。该类包括了一个 iOperation 数组,用于存储不同的操作接口实现类。
- 程序入口类: 主要包括了一个 Main 类,作为整个程序的入口。该类主要包括一个菜单方法,用于显示可选的操作列表,并提供了一个样例的用户界面,让用户可以通过输入数字选择不同的操作。
流程
流程如下:
- 当用户启动图书管理系统时,系统显示一个菜单,让用户选择对应的操作。
- 用户输入对应的数字,选择要执行的操作。
- 系统根据用户输入的数字,调用相应的操作接口实现类的 work() 方法,执行对应的图书管理操作。
- 操作结束后,系统重新显示菜单,等待用户继续输入操作选项。
- 如果用户选择退出系统,程序结束执行。
具体内容
如图所示,我们在src下建立三个包,分别为
- 实体类
books
存放图书类Book / 图书列表类BookList - 操作类:
- AddOperation: 新增图书
- BorrowOperation:借阅图书
- DelOperation:删除图书
- DisplayOperation:显示图书
- ExitOperation:退出系统
- FindOperation:查找图书
- IOperation:操作接口
- ReturnOperation:归还图书
- 用户类:
- AdminUser:管理员用户
- NormalUser:普通用户
- User:用户类
- 入口类:
Main
类
代码实现
books
Book(图书类)
图书类没有复杂的函数实现,主要有以下内容
- 图书基本信息(成员变量)
- 构造函数
- getter && setter 相应的图书信息
tostring
函数用于返回输出图书信息
代码中有相应注释,不再过多赘述
package books;
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;
//IsBorrowed = isBorrowed;
}
// getter && setter
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;
}
// 调用时将返回图书信息(字符串形式)
public String toString(){
return "Book{"
+"name="+getName()+", "
+"author="+getAuthor()+", "
+"price="+getPrice()+", "
+"type="+getType()+", "
+"isborrowed="+isBorrowed()
+"}";
}
}
BookList(图书列表类)
BookList包含一个Book类型的数组用于存放book图书 和 一些操作函数
具体在代码中注释写道
package books;
public class BookList {
public Book[] books = new Book[10]; // 图书类数组
public int usedSize;//存储当前书的个数
// 无参构造:初始化Booklist
// 存三本书
public BookList(){
books[0] = new Book("三国演义","罗贯中",68,"小说");
books[1] = new Book("水浒传","施耐庵",68,"小说");
books[2] = new Book("西游记","吴承恩",67,"小说");
this.usedSize = 3;
}
// 获取当前存储的书的个数
public int getUsedSize() {
return usedSize;
}
//有效书的数量
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
// 返回book类数组的相应下标
// 用于通过位置查找图书
public Book getPos(int pos){
return books[pos];
}
// 特定位置设置图书对象
public void setBooks(Book book,int pos){
books[pos] = book;
}
}
user
User(用户抽象类)
- User为一个抽象类,主要用于声明两种用户都会执行的操作
- 其中需要注意的内容有:
- menu方法(打印菜单:不同类型用户的操作不一样,所以菜单不一样)
- IOperation类数组,用于存放用户可以执行的全部操作,通过输入chioce执行队形的操作
package user;
import books.BookList;
import operations.IOperation;
public abstract class User {
protected String name; // 成员变量:姓名
protected IOperation iOperation[]; // iOperation类数组 - 用于存放可执行的操作
public User(String name){
this.name = name;
} // 构造函数
public abstract int menu(); // 菜单:管理员用户和普通用户的操作不同
// 执行操作
// iOperation在后文
// iOperation[] 存放不同用户可以执行的操作
// 通过输入chioce来执行相应的操作
public void doOperation(int choice, BookList bookList){
iOperation[choice].work(bookList);
}
}
AdminUser(管理员用户)
- AdminUser类:管理员用户,主要内容包括Iopetation类的数组,和一个对应的操作菜单
- 以下是IOperation数组中包含的操作:
- 查询图书:FindOperation()
- 添加图书:AddOperation()
- 删除图书:DelOperation()
- 显示图书:DisplayOperation()
- 退出系统:ExitOperaion()
package user;
import operations.*;
import user.User;
import java.util.Scanner;
public class AdminUser extends User { // 继承User类
// 构造函数
public AdminUser(String name) {
super(name);
// 对应管理员用户可执行的操作
this.iOperation = new IOperation[]{
new ExitOperaion(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new DisplayOperation()
};
}
// 对应管理员用户的菜单
public int menu(){
System.out.println("****************************************");
System.out.println("hello"+ "\t" + name+ "\t" + "欢迎使用图书管理系统");
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(普通用户)
- 普通用户类NormalUser内部和管理员用户并无差别
- 以下是普通用户IOperation数组中的操作
- 查找图书:FindOperation()
- 借阅图书:BorrowOperation()
- 归还图书:ReturnOperation()
- 显示图书:DisplayOperation()
- 退出系统:ExitOperaion()
package user;
import operations.*;
import user.User;
import java.util.Scanner;
public class NormalUser extends User {
public NormalUser(String name) {
super(name);
// 创建iOperation数组 存普通用户可执行的操作
this.iOperation = new IOperation[]{
new ExitOperaion(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
new DisplayOperation()
};
}
// 普通用户的对应的菜单
public int menu(){
System.out.println("****************************************");
System.out.println("hello"+ "\t" + name+ "\t" + "欢迎使用图书管理系统");
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;
}
}
Main类
- Main类主要包含Login方法,即实现用户登陆操作
- 主要步骤如下:
- 创建一个空的 BookList 对象(bookList)用于存放图书信息。
- 调用 Login 方法来进行用户登录操作,获取一个 User 对象(user)。这个 User 对象代表着当前登录的用户,可以执行特定的操作以管理图书列表。
- 用while(true)使程序可以持续进行,直到用户进行退出程序操作(chioce = 0)
import books.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
// Login()方法 - 用户登陆
public static User Login() {
System.out.println("请输入您的姓名:");
Scanner scanner = new Scanner(System.in);
String Username = scanner.nextLine();
while (true) {
System.out.println("请输入您的身份:> 管理员(1)/普通用户(2)");
int choice = scanner.nextInt();
if (choice == 1) {
return new AdminUser(Username);
} else if (choice == 2) {
return new NormalUser(Username);
}else{
System.out.println("输入错误,请重新输入");
}
}
}
public static void main(String[] args) {
BookList bookList = new BookList(); // 创建一个Booklist类对象,存放图书信息
//登陆
User user = Login(); // 执行Login()方法,登陆
// 执行选项
// 用while(true)使程序可以持续进行,直到用户进行退出程序操作(chioce = 0)
while(true){
int choice = user.menu();
user.doOperation(choice,bookList);
}
}
}
operations
IOperation(操作接口)
- 接口(IOperation) ,该接口包含了一个名为 work 的方法,这个方法接受一个 BookList 对象作为参数
- 接口中定义的 work 方法 接受一个 BookList 对象作为参数。这个参数是一个封装了多个图书对象的列表对象,在执行具体操作时,我们可以通过该列表对象来访问和修改列表中的图书信息。
package operations;
import books.BookList;
public interface IOperation {
void work(BookList bookList);
}
ExitOperation(退出系统)
重写IOperation的work方法进行功能实现,实现比较简单,直接使用System.exit(0)
退出即可
这里主要讲一下是程序是怎样读取操作到退出的(运行过程):
操作运行过程
具体过程如图所示:
以下为ExitOperation的实现
package operations;
import books.BookList;
public class ExitOperaion implements IOperation{
@Override
public void work(BookList bookList){
System.exit(0);//退出系统操作
}
}
AddOperation(新增图书)
- 从控制台获取用户输入的图书的名称、作者、类型和价格等信息,然后根据这些信息创建一个新的 Book 对象。
- 将这个新创建的 Book 对象存储在当前可用的位置(即 bookList.usedSize 所代表的位置),并将 bookList.usedSize 的值加 1,表示图书列表中有效的书的数量已经增加了一个
package operations;
import books.Book;
import books.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation{
public void work(BookList bookList){
// 添加图书
System.out.println("添加图书");
// 添加图书信息
//先输入nextLine后输入nextInt
//不然需要在nextInt后读取回车
System.out.println("请输入要添加的图书名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入要添加的图书作者");
String author = scanner.nextLine();
System.out.println("请输入要添加的图书类型");
String type = scanner.nextLine();
System.out.println("请输入要添加的图书价格");
int price = scanner.nextInt();
Book book = new Book(name,author,price,type);
//获取当前存放书的位置
int currentSize= bookList.usedSize;
//把书存放在指定位置(下标即对应位置)
bookList.setBooks(book,currentSize);
//将书的有效个数+1
bookList.setUsedSize(currentSize+1);
}
}
DelOperation(删除图书)
- 首先输入要删除的图书,然后遍历此时的bookList数组,查找是否有这本书
- 如果有再执行删除操作,没有打印提示信息
- 删除操作:将待删除的书后面的书向前移动1位
- 执行删除操作后 将booklist最后一位置空
package operations;
import books.Book;
import books.BookList;
import sun.font.FontRunIterator;
import java.util.Scanner;
public class DelOperation implements IOperation{
@Override
public void work(BookList bookList){
System.out.println("删除图书");
System.out.println("请输入要删除的图书名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();
int index = -1;//是否存在该图书的标志
// 遍历bookList查找是否存在要删除的图书
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getPos(i);
if(name.equals(book.getName())){
index = i; // 找到该书就改变index的值,退出循环
break;
}
}
// 此时判断是否进行删除操作
if(index == -1){
System.out.println("要删除的图书不存在");
}else{
// 执行删除操作,讲此时index后的所有元素前移1位即可
for (int i = index; i < currentSize-1; i++) {
//把i+1下标的书放到i下标
Book book = bookList.getPos(i+1);
bookList.setBooks(book,i);
}
//每次删除后进行置空
bookList.setBooks(null,currentSize-1);
bookList.setUsedSize(currentSize-1);
System.out.println(name+"已被删除");
}
}
}
DisplayOperation(显示图书)
- 遍历打印数组元素book即可
package operations;
import books.Book;
import books.BookList;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
public class DisplayOperation implements IOperation{
@Override
public void work(BookList bookList){
System.out.println("显示图书");
System.out.println("****************************************");
// 遍历数组打印book即可(book是一个返回图书信息的)
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getPos(i);
System.out.println(book);
}
}
}
BorrowOperation(借阅图书)
- 和前面的操作大同小异,通过遍历数组,通过
name.equals(book.getName())
比较输入的name是否和数组中书名有相同的,最后更新借阅状态
package operations;
import books.Book;
import books.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
System.out.println("请输入要借阅的图书名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();
// 遍历booklist 读取所有图书信息
int flag = 0; // 最后判断是否借阅成功
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getPos(i);
if (name.equals(book.getName())) {
if (book.isBorrowed()) {
flag = 1;
System.out.println("该书已经被借出");
} else {
book.setBorrowed(true);
System.out.println("图书借阅成功");
flag = 1;
break;
}
}
}
if(flag == 0){
System.out.println("要借阅的图书不存在");
}
}
}
ReturnOperation(归还图书)
- 和借阅图书一样的操作,如果归还成功后进行
book.setBorrowed(false)
即将该书的借阅状态设为未被借阅(isBorrwed = false)
package operations;
import books.Book;
import books.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
System.out.println("请输入要归还的图书名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getPos(i);
if(name.equals(book.getName())){
book.setBorrowed(false);
System.out.println("图书归还成功");
break;
}
}
System.out.println("要归还的图书不存在");
}
}
FindOperation(查找图书)
- 遍历数组对比输入的name和书名是否相同,如果找到了就打印图书信息
package operations;
import books.Book;
import books.BookList;
import java.util.Scanner;
public class FindOperation implements IOperation{
@Override
public void work(BookList bookList){
System.out.println("查找图书");
System.out.println("请输入要查找的图书名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
// 遍历数组 查找书籍
int CurentSize = bookList.getUsedSize();//数组此时的书的数量
for (int i = 0; i < CurentSize; i++) {
Book book = bookList.getPos(i);
if(name.equals(book.getName())){
System.out.println("找到了这本书!\n"+book); // 输出提示并打印图书信息
return;
}
}
System.out.println("这本书不存在");
}
}
完整代码
java项目图书管理系统