写在前面:
博主主页:戳一戳,欢迎大佬指点!
博主秋秋:QQ:1477649017 欢迎志同道合的朋友一起加油喔
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个小菜鸟嘿嘿
-----------------------------谢谢你这么帅气美丽还给我点赞!比个心-----------------------------
首先,这是一个关于图书管理的小练习,整个练习要求的是实现一个简单的图书管理系统,需要包含登录功能,菜单功能,登陆时有两种用户身份,一个是管理员用户,另一个是普通用户身份。针对于不同的用户身份,我们需要实现的功能也不同,如下:
1,管理员用户
查找功能,新增功能,删除功能,显示功能,退出功能
2,普通用户
查找功能,借阅功能,归还功能,退出功能
package book;
public class Book {
private String name;//书名
private String author;//作者
private int price;//价格
private String type;//书的类型
private boolean isBorrowed;//是否被借出,不需要在构造方法中进行初始化,因为默认就是false,未借出
public Book(String name, String author, int price, String type) {//构造方法
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
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;
}
@Override
public String toString() {
return "Book:" +
"name='" + name + '\'' +
"\tauthor='" + author + '\'' +
"\tprice=" + price +
"\ttype='" + type + '\'' +
"\tisBorrowed=" + ((isBorrowed == false)? "未借出" : "已借出")
;
}
}
Book类是书本类,里面组织的是有关于书本的属性以及方法,例如书本的名字,作者,价格,类型,以及是否被借出,这些都是书的属性,然后里面的get和set方法是为了从类外能够设置和拿到这些属性的值,toString方法的重写是为了后续显示图书时候的打印输出功能。
package book;
public class BookList {
Book[] book = new Book[10];//假设初始最多就只放10本书
private int usedSize;//记录数组中元素的个数,也就是书的本数
public BookList() {
book[0] = new Book("三国演义","罗贯中",29,"小说");
book[1] = new Book("西游记","吴承恩",30,"小说");
book[2] = new Book("红楼梦","曹雪芹",22,"小说");
usedSize = 3;//初始化数组中放有三本书
}
public int getUsedSize() {
return usedSize;//实时取到数组元素的个数
}
public void setUsedSize(int Size) {
this.usedSize = Size;//实时设置数组元素的个数
}
public Book getBook(int pos){
return book[pos];//根据下标返回对应位置上的书
}
public void setBook(int pos,Book tmpBook){
book[pos] = tmpBook;//将某一本新书添加到我们的数组中
}
}
BookList是一个书架类,书架类的存在就是为了统筹管理这些书,里面的book数组是为了将书本进行存储,usedSize是为了实时记录书架中的书本的个数,同样的,既然有了这两个成员,那么同样的也得有获得和设置的接口,让他们在类外能访问到。
package operation;
import book.BookList;
public interface Ibookoperatortion {//这是对于书本各个操作的一个规范接口
void doBook(BookList booklist);
}
书本会有很多的功能,那么这些功能的操作对象无疑全是BookList这个类的对象,因为是要将书本从书架上进行增删等操作,所以我们可以将这种操作抽离成一个规范的接口,然后在具体的功能类里面,去重写实现相应的功能。
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements Ibookoperatortion{
@Override
public void doBook(BookList booklist) {
System.out.println("请输入你要添加的书的名字>>");
Scanner scan1 = new Scanner(System.in);
String name = scan1.nextLine();
System.out.println("请输入你要添加的书的作者>>");
Scanner scan2 = new Scanner(System.in);
String author = scan2.nextLine();
System.out.println("请输入你要添加的书的价格>>");
Scanner scan3 = new Scanner(System.in);
int price = scan3.nextInt();
System.out.println("请输入你要添加的书的类型>>");
Scanner scan4 = new Scanner(System.in);
String type = scan4.nextLine();
Book book = new Book(name,author,price,type);//new一个book对象
int currentSize = booklist.getUsedSize();//获取当前UsedSize
booklist.setBook(currentSize,book);//将书放进当前的位置
booklist.setUsedSize(currentSize + 1);//将UsedSize + 1
System.out.println("添加成功!");
}
}
package operation;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements Ibookoperatortion{
@Override
public void doBook(BookList booklist) {
System.out.println("请输入您想要借阅的图书的名字>>");
Scanner scan = new Scanner(System.in);
String bookName = scan.nextLine();
for(int i = 0;i < booklist.getUsedSize();i++){
if(booklist.getBook(i).getName().equals(bookName)){
if(booklist.getBook(i).isBorrowed()){
System.out.println("对不起,该书已经借出,请重新进行选择!");
return;
}
booklist.getBook(i).setBorrowed(true);
System.out.println("借阅成功!");
return;
}
}
}
}
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements Ibookoperatortion{
@Override
public void doBook(BookList booklist) {
System.out.println("请输入您想要删除的图书的名字>>");
Scanner scan = new Scanner(System.in);
String bookName = scan.nextLine();
int set = 0;//先找到你要删除的书的位置
for(int i = 0;i < booklist.getUsedSize();i++){
if(booklist.getBook(i).getName().equals(bookName)){
set = i;
}
}
for(int j = set;j < booklist.getUsedSize() - 1;j++){
Book tmpBook = booklist.getBook(j+1);//先拿到j+1位置上的书
booklist.setBook(j,tmpBook);//将j+1位置上的书赋值给j位置上的书
}
int currentSize = booklist.getUsedSize();
booklist.setUsedSize(currentSize - 1);
System.out.println("删除成功!");
}
}
package operation;
import book.BookList;
public class DisplayOperation implements Ibookoperatortion{
@Override
public void doBook(BookList booklist) {
System.out.println("显示成功,所有图书信息如下:");
for( int i = 0;i < booklist.getUsedSize();i++){
System.out.println(booklist.getBook(i));
}
}
}
package operation;
import book.BookList;
public class ExitOperation implements Ibookoperatortion{
@Override
public void doBook(BookList booklist) {
System.out.println("退出成功!");
System.exit(0);//0代表程序正常结束,这是系统的退出功能
}
}
package operation;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements Ibookoperatortion{
@Override
public void doBook(BookList booklist) {
System.out.println("请输入您想要查找的图书的名字>>");
Scanner scan = new Scanner(System.in);
String bookName = scan.nextLine();
int i;
for( i = 0;i < booklist.getUsedSize();i++){
if(booklist.getBook(i).getName().equals(bookName)){
System.out.println("查找成功,图书信息如下:");
System.out.println(booklist.getBook(i));
break;
}
}
if(i == booklist.getUsedSize()){
System.out.println("经过查找,该书不存在!");
}
}
}
package operation;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements Ibookoperatortion{
@Override
public void doBook(BookList booklist) {
System.out.println("请输入您想要归还的图书的名字>>");
Scanner scan = new Scanner(System.in);
String bookName = scan.nextLine();
for(int i = 0;i < booklist.getUsedSize();i++){
if(booklist.getBook(i).getName().equals(bookName)){
booklist.getBook(i).setBorrowed(false);
System.out.println("归还成功!");
return;
}
}
}
}
package user;
import book.BookList;
import operation.Ibookoperatortion;
public abstract class User {
protected String name;//用户名
public Ibookoperatortion[] ioperation;
public User(String name) {//构造方法
this.name = name;
}
public abstract int menu();//抽象方法无需具体实现,在实现类里面具体实现
public void doOperation(int choice, BookList booklist){//与主函数不在同一个包,也不是子类关系,所以设置成public
ioperation[choice].doBook(booklist);
}
}
User类是用户的类,其中包含用户名以及接口数组两个成员,这里重点要说的是这个接口数组,因为管理员用户以及普通用户都会继承User类,所以在具体的子类继承后会给这个接口数组赋值相应的实现了接口的功能类。然后就是menu方法,因为具体的实现只需要在子类里面,所以就将它设置为了抽象方法,那么User类自然也就是抽象类,至于doOperation方法,很重要,因为这个方法将我们的选择与对应的方法关联起来了。
package user;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name) {//必须显式调用父类构造方法
super(name);
this.ioperation = new Ibookoperatortion[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new DisplayOperation()
};
}
public int menu(){
System.out.println(this.name + " 你好~,欢迎使用图书管理系统!");
System.out.println("1,查找图书>>");
System.out.println("2,新增图书>>");
System.out.println("3,删除图书>>");
System.out.println("4,显示图书>>");
System.out.println("0,退出系统>>");
System.out.println("请您进行操作的选择>>");
Scanner scan = new Scanner(System.in);
int choice = scan.nextInt();
return choice;
}
}
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.ioperation = new Ibookoperatortion[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation()
};
}
public int menu(){
System.out.println(this.name + " 你好~,欢迎使用图书管理系统!");
System.out.println("1,查找图书>>");
System.out.println("2,借阅图书>>");
System.out.println("3,归还图书>>");
System.out.println("0,退出系统>>");
System.out.println("请您进行操作的选择>>");
Scanner scan = new Scanner(System.in);
int choice = scan.nextInt();
return choice;
}
}
import book.Book;
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {//进行逻辑的整合,整个程序的入口
public static User login(){
System.out.println("请输入你的姓名>>");
Scanner scan1 = new Scanner(System.in);
String name = scan1.nextLine();
System.out.println("请选择您的身份:>> 1,管理员 0,普通用户");
Scanner scan2 = new Scanner(System.in);
int choice = scan2.nextInt();
if(choice == 1){
return new AdminUser(name);//根据相应的选择去new用户
}else{
return new NormalUser(name);
}
}
public static void main(String[] args) {
BookList booklist = new BookList();// new一个书架对象,走构造方法,先把默认的三本书准备好
User user = login();//用父类类接收子类的对象
while(true){
int choice = user.menu();//输出菜单,进行选择,这里发生了动态绑定
if(choice >= user.ioperation.length){//这里判断一下choice的大小,因为输入的值可能会超过ioperation这个数组的下标
System.out.println("您的输入有误,请重新输入!>>");
continue;
}
user.doOperation(choice,booklist);
}
}
}
图示:
以管理员用户把如何调用到相关功能函数的过程模拟一下:
✅当然,如果大家想要看完全的代码,码云链接附上:
完全代码,戳一戳这里!