目录
图书管理系统
该系统用于管理图书,帮助用户快速借书还书的系统。设置有管理员和普通用户两种角色,管理员可以管理图书的增删改查,用户可以借书还书等操作,经过分析,首先可以抽象出分该系统涉及到三大部分:书,用户以及操作。
整个项目的框架如下:
图书相关设计
对于书,我们需要对书的详细情况进行描述,因此我们可以在book包下创建一个图书类Book,书的私有属性包括其名称、作者、价格、类型以及状态。但我们需对外提供相应的get和set方法,这也体现出java的封装特性,对外提供公开的接口,隐藏其内部细节。
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;
}
//为私有属性提供公开的Getter and 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;//默认false
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +","+
(isBorrowed == true?" 已借出 ":" 未借出 ")+
'}';
}
}
有了一本书的具体描述之后,我们需要一个书架,用于放所有的图书,我这里采用数组实现,每个下标存放的都是一个图书对象,并且提供放书和拿书的方法。以下是书架BookList类,同样将其在book包中创建。
package book;
//书架
public class BookList {
public Book[] bookList = new Book[10];
private int usedSize;//代表当前书架上有几本书
//构造方法
public BookList(){
this.bookList[0]=new Book("三国演义","罗贯中",18,"小说");
this.bookList[1]=new Book("西游记","吴承恩",48,"小说");
this.bookList[2]=new Book("水浒传","施耐庵",28,"小说");
this.usedSize=3;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
//把书放到pos位置
public void setBookList(int pos,Book book){
bookList[pos]=book;
}
//获得pos位置的书
public Book getBook(int pos){
return bookList[pos];
}
}
操作类相关设计
管理员的操作包含对图书的增删改查,用户的操作包含查找、借阅、归还,我们可将所有的操作都创建在operation包中,且所有操作均含有work方法,则可以生成一个统一标准,即为一个接口IOperation,可实现多态。
设置一个操作类接口,其包含work方法,实现该接口的类都可以重写该方法。
package operation;
import book.Book;
import book.BookList;
public interface IOperation {
void work(BookList bookList);
}
1.增加图书的操作类AddOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation{
public void work(BookList bookList){
System.out.println("新增图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入新增的图书名称:");
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.getUsedSize();
bookList.setBookList(currentSize,book);
bookList.setUsedSize(currentSize+1);
System.out.println("新增成功!");
}
}
2.借阅图书的操作类BorrowOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation{
public void work(BookList bookList){
System.out.println("借阅图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入借阅的图书名称:");
String name=scanner.nextLine();
int currentSize=bookList.getUsedSize();
for(int i=0;i<currentSize;i++){
Book book=bookList.getBook(i);
if(book.getName().equals(name)){
book.setBorrowed(true);
System.out.println("借阅成功!信息如下:");
System.out.println(book);
return;
}
}
System.out.println("书架没有这本书!无法借阅。。。");
}
}
3.删除图书的操作类DelOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation{
public void work(BookList bookList){
System.out.println("删除图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入删除的图书名称:");
String name=scanner.nextLine();
//查找要删除的书
int currentSize=bookList.getUsedSize();
int index=-1;
for(int i=0;i<currentSize;i++){
Book book=bookList.getBook(i);
if(book.getName().equals(name)){
index=i;
break;
}
}
if(index==-1){
System.out.println("没有这本书!");
return;
}
//删除
for (int i=index;i<currentSize-1;i++){
Book book= bookList.getBook(i+1);
bookList.setBookList(i,book);
}
bookList.setUsedSize(currentSize-1);
System.out.println("删除成功!");
}
}
4.显示图书的操作类DisplayOperation
package operation;
import book.Book;
import book.BookList;
public class DisplayOperation implements IOperation{
public void work(BookList bookList){
System.out.println("显示图书!");
int currentSize= bookList.getUsedSize();
for(int i=0;i<currentSize;i++){
Book book= bookList.getBook(i);
System.out.println(book);
}
}
}
5.退出系统的操作类ExitOperation
package operation;
import book.Book;
import book.BookList;
public class ExitOperation implements IOperation{
public void work(BookList bookList){
//可以对书架手动清空一次
System.out.println("成功退出系统!");
System.exit(0);
}
}
6.查找图书的操作类FindOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOperation{
public void work(BookList bookList){
System.out.println("查找图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入查找的图书名称:");
String name=scanner.nextLine();
int size=bookList.getUsedSize();
for(int i=0;i<size;i++){
Book book=bookList.getBook(i);
if(book.getName().equals(name)){
System.out.println("找到了这本书!");
System.out.println(book);
return;
}
}
System.out.println("没有这本书!");
}
}
7.归还图书的操作类ReturnOperation
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
public void work(BookList bookList){
System.out.println("归还图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入归还的图书名称:");
String name=scanner.nextLine();
int currentSize=bookList.getUsedSize();
for(int i=0;i<currentSize;i++){
Book book=bookList.getBook(i);
if(book.getName().equals(name)){
book.setBorrowed(false);
System.out.println("归还成功,信息如下:");
System.out.println(book);
return;
}
}
System.out.println("书架没有这本书!无法归还。。。");
}
}
用户相关设计
因为我们的系统需要管理员和普通用户的参与,且其两者的操作不同,那么看到的菜单也应该是不一致的,管理员和普通用户都继承于用户类。用户类中包括名称、存放操作的数组、菜单以及调用菜单的方法。
package user;
import book.Book;
import book.BookList;
import operation.IOperation;
public abstract class User {
protected String name;
protected IOperation[] iOperations;
public User(String name){
this.name=name;
}
public abstract int menu();
public void doOperation(int choice, BookList bookList){
this.iOperations[choice].work(bookList);
}
}
管理员类
package user;
import operation.*;
import java.util.Scanner;
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("欢迎"+this.name+"来到图书小练习");
System.out.println("**************1.查找图书*****************");
System.out.println("**************2.新增图书*****************");
System.out.println("**************3.删除图书*****************");
System.out.println("**************4.显示图书*****************");
System.out.println("**************0.退出系统*****************");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}
普通用户类
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User{
public NormalUser(String name) {
super(name);
this.iOperations=new IOperation[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation()
};
}
public int menu(){
System.out.println("**************普通用户菜单*****************");
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 scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}
主函数
当我们使用该系统时,需要根据用户的输入辨别是管理员还是普通用户,以此来调用显示对应的菜单,用户才能选择对应的操作,所以先需要用户登录一下系统,登录后再根据用户的选择去作出相应操作。
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 scanner=new Scanner(System.in);
String name=scanner.nextLine();
System.out.println("请选择你的身份:1->管理员 0->普通用户");
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();
//User user=new AdminUser(name);管理员菜单
//User user=new NormalUser(name);普通用户菜单
while(true) {
int choice = user.menu();//拿到用户的选择
//System.out.println(choice);
user.doOperation(choice, bookList);
}
}
}
以此整个项目就书写完成,运行如此:
欢迎家人们补充~,喜欢就点个关注支持一下吧,谢谢大家!ღ( ´・ᴗ・` )比心