javase基础第十五篇:图书管理系统
Posted 爱编程的大杉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javase基础第十五篇:图书管理系统相关的知识,希望对你有一定的参考价值。
知识导航🚩
一.设计准备
1.需求概述
设计一个图书管理系统,根据管理员和普通用户分类,实现不同的功能菜单,对图书系统进行管理。(通过代码实现简单登录,以及客户端,用户端功能的设计。)
2、项目分析
1,项目主体大致分为三类,和书相关的类,和操作相关的类,和用户相关的类。(因此需要定义三个包:book,operation,User)
2.因为图书管理系统书是主要的元素,所以需要定义一个Book类,来表示书。定义一个Booklist类(顺序表:本质是数组)来存储书籍。
3.关于操作包内需要根据需求,具体定义类来实现具体要求的功能
3.用户包中,定义一个抽象user类,通过对user的继承实现管理员(Admin)类,和普通用户(NormalUser)类进行具体功能的实现。
二.类的设计
1.关于书相关的类
1.Book类
package book;
//书是一个主体(对象),是图书馆中的组成部分
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;
//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;
//打印图书内容
@Override
public String toString()
return "Book" +
"name='" + name + '\\'' +
", author='" + author + '\\'' +
", price=" + price +
", type='" + type + '\\'' +
", isBorrowed=" + isBorrowed +
'';
2.Booklist类(顺序表的设计)
package book;
import java.util.Arrays;
//顺序表(数组)存储所有图书
public class BookList
//顺序表本来就是数组,定义一个Book类的数组对书进行存储,容量为100
Book [] books=new Book[100];
//usedSize:书的数量的有效长度
public int usedSize=0;
public BookList()
//初始化存储三本书
books[0]=new Book("三国演义","罗贯中",20,
"小说");
books[1] = new Book("水浒传", "施耐庵", 100,
"小说");
books[2] = new Book("西游记", "吴承恩", 100,
"小说");
this.usedSize=3;
//setBook和getBook不一定要随机生成,要自己设立内容,来满足需求
//设置图书:将pos位置的元素设为指定的书book
public void setBook(int pos,Book book)
this.books[pos]=book;
//获得pos位置的图书
public Book getBooks(int pos)
return this.books[pos];
//可以根据实际情况更改UsedSize
public int getUsedSize()
return usedSize;
public void setUsedSize(int usedSize)
this.usedSize = usedSize;
2.关于操作相关的类
1.Addoperation(添加)
package operation;
//导入book类下的Book类和booklist类
import book.Book;
import book.BookList;
import java.util.Scanner;
//类实现Ioperation:在下面的接口部分会说
public class AddOperation implements IOperation
@Override
//输入新增图书的信息
public void work(BookList bookList)
//输入添加新书的信息
System.out.println("新增图书");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入图书的名字");
String name=scanner.next();
System.out.println("请输入图书的作者");
String author=scanner.next();
System.out.println("请输入图书的价格");
int price=scanner.nextInt();
System.out.println("请输入图书的类型");
String type=scanner.next();
//根据输入信息生成一本书book
Book book=new Book(name,author,price,type);
//获取目前顺序表的有效长度
int curSize=bookList.getUsedSize();
//利用steBook在相应位置存入图书
bookList.setBook(curSize,book);
//有效长度加一
bookList.setUsedSize(curSize+1);
System.out.println("新增成功!");
2.Borrowoperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation
@Override
public void work(BookList bookList)
Scanner scanner =new Scanner(System.in);
System.out.println("请借阅图书的名字");
String name=scanner.next();
for (int i = 0; i <bookList.getUsedSize() ; i++)
Book book=bookList.getBooks(i);
if (book.getName().equals(name))
//借阅图书就是将图书的状态改为已经借出,即通过setBorrowed接口
//将isBorrowed改为true
book.setBorrowed(true);
System.out.println("借阅成功!");
return;
System.out.println("查无此书!");
3.DelOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation
@Override
public void work(BookList bookList)
System.out.println("删除图书");
Scanner scanner =new Scanner(System.in);
System.out.println("请输入删除图书的名字");
String name=scanner.next();
int i=0;
for (; i <bookList.getUsedSize() ; i++)
Book book=bookList.getBooks(i);
if (book.getName().equals(name))
break;
if (i==bookList.getUsedSize())
System.out.println("查无此书!");
else
//删除图书和前面说到的顺序表删除元素的原理一样,就是让后面的元素前进一位覆盖掉要删除的元素
for (int pos=i;pos<bookList.getUsedSize()-1;pos++)
//pos位置的书改为pos+1位置的书。覆盖要删除的元素
bookList.setBook(pos,bookList.getBooks(pos+1));
System.out.println("删除成功");
//有效长度减一
bookList.setUsedSize(bookList.getUsedSize()-1);
4.DisplayOperation
package operation;
import book.Book;
import book.BookList;
public class DisplayOperation implements IOperation
@Override
public void work(BookList bookList)
System.out.println("显示图书");
for (int i = 0; i <bookList.getUsedSize() ; i++)
Book book=bookList.getBooks(i);
System.out.println(book.toString());
5.ExitOperation
package operation;
import book.BookList;
public class ExitOperation implements IOperation
@Override
public void work(BookList bookList)
System.out.println("退出系统");
System.exit(1);
6. FindOperation(查找)
package operation;
import book.BookList;
public class ExitOperation implements IOperation
@Override
public void work(BookList bookList)
System.out.println("退出系统");
System.exit(1);
7.ReturnOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation
@Override
public void work(BookList bookList)
Scanner scanner =new Scanner(System.in);
System.out.println("请输入归还图书的名字");
String name=scanner.next();
for (int i = 0; i <bookList.getUsedSize() ; i++)
Book book=bookList.getBooks(i);
if (book.getName().equals(name))
//将是否借出改为false(未借出)
book.setBorrowed(false);
System.out.println("归还成功!");
return;
System.out.println("查无此书!");
8.IOperation(接口)
因为上述功能都有一个work方法,所以干脆将work定义在一个类中,通过类对接口的实现,重写work方法,实现具体的功能。
package operation;
import book.BookList;
public interface IOperation
public void work(BookList bookList);
三.关于用户相关的类
1.user
package user;
import book.BookList;
import operation.IOperation;
public abstract class User
//图书管理/借阅人的姓名
protected String name;
//因为管理员和普通用户可以执行的功能不同,所以父类需要一个执行数组,
// 然后子类根据实际情乱况进行初始化
protected IOperation [] operations;
public User(String name)
this.name = name;
//客户端和普通用户的菜单不一样,所以父类不做具体的处理,方法定义为abstract类型。所以类也应为abstract类型,仅用作被继承的作用
public abstract int menu();
/**
* IOperation写在这里的好处
* 1.IOperation数组本身就在这个类中。可以直接使用
* 2.子类继承User也可以直接调用IOperation
* 3.主函数可以直接通过user调用IOperation;
* @param bookList
* @param choice
*/
public void IOperation(BookList bookList,int choice)
//选中数字指令后,执行对应类下的work
this.operations[choice].work(bookList);
2.NormalUser
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User
//帮助父类完成构造方法
public NormalUser(String name)
super(name);
//初始化对应序列需要实现的功能(对应菜单)
this.operations=new IOperation[]
//“0”号下标对应退出
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
new DisplayOperation()
;
@Override
public int menu()
System.out.println("=============================");
System.out.println("Hello " + 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("=============================");
System.out.println("请输入您的选择: ");
Scanner scanner = new Scanner(以上是关于javase基础第十五篇:图书管理系统的主要内容,如果未能解决你的问题,请参考以下文章