用java实现图书馆管理系统

前言

前面,我们学习了类和对象,继承和多态,抽象类和接口等基础知识,那么,我们利用这些知识来实现一个图书馆管理系统,以此来巩固一下前面的知识。

设计思路:

  1. 首先,我们得定义一个BOOK类,这个类用来描述书的价格,书名,作者等属性。有了书,那便得有书架,书架上存放着书。定义BookList类,可以先把几本书存放在书架上,即初始化。
  2. 对于普通用户和管理员来说,所展示出来的界面是不同的,所以对两者所展示出来的菜单和可实现的功能是不同的。
  3. 对于管理员来说,我们需要实现添加书籍,查找书籍,删除书籍,显示书籍和退出系统。
  4. 对于普通用户来说我们可以查找书籍,借阅书籍,归还书籍和退出系统。
  5. 主要针对管理员和普通用户来一 一实现这些功能

代码的实现

User包

这个包有用户类和管理员类

User类

package user;

import Oper.IOperation;
import book.Booklist;

public abstract class User {
    public String name;
    public IOperation[] iOperation;
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
    public void dowork(int coice, Booklist booklist){
            this.iOperation[coice].work(booklist);
    }

}

AdminUser类(管理员)

package user;

import Oper.*;
import book.Booklist;

import java.util.Scanner;

public class AdminsUer extends User{
    public AdminsUer(String name) {
        super(name);
        this.iOperation=new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation(),

        };
    }

    public int menu(){
        System.out.println("____________________________________");
        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 chioe=scanner.nextInt();
        return chioe;
    }

}

NormolUser类(用户)

package user;

import Oper.*;

import java.util.Scanner;

public class NormolUser extends User{
    public NormolUser(String name) {
        super(name);
        this.iOperation=new IOperation[]{
                new ExitOperation(),
            new FindOperation(),
            new BrrowOperation(),
            new ReturnOperation(),
                new ShowOperation()

        };
    }
    public int menu(){
        System.out.println("_________________");
        System.out.println("hello,"+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 chioe=scanner.nextInt();
        return chioe;
    }
}

book包

这个包里存放着Book和Booklist类

BOOK类

创建一个book包,包里面存放Book和BookList类。

首先是book类,注意构造方法中不用为isBorrowed属性初始化,因为默认就是false状态,在这里,我们对toString方法做了一点小小的改动,将true和false分别改成对应的借出和未借出状态。我们还提供了get和set方法来获取被封装的成员属性。

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;

    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public int getPrice() {
        return price;
    }

    public String getType() {
        return type;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + (isBorrowed==true?"已借出":"未借出") +
                '}';
    }
}

BookList类

这是一个书架类,我定义了一个Book类型的数组,大小暂时定了10个。在书架上存放了三本书进去。usedsiae是用来记录书架上有几本书

package book;

import java.util.Arrays;

public class Booklist {
    private Book[] books=new Book[10];
    private int usedsiae;

    public Booklist() {
        books[0]=new Book("三国演义","罗贯中",40,"小说");
        books[1]=new Book("西游记","吴承恩",60,"小说");
        books[2]=new Book("红楼梦","曹雪芹",45,"小说");
        this.usedsiae=3;

    }

    public int getUsedsiae() {
        return usedsiae;
    }

    public void setUsedsiae(int usedsiae) {
        this.usedsiae = usedsiae;
    }

    public Book getBooks(int pos) {
        return books[pos];
    }

    public void setBooks(int i,Book books) {
        this.books[i] = books;

    }

    public Book[] getBooks() {
        return books;
    }
    public void setBooks(int i) {
        this.books[i] = books[i+1];

    }

    }

Oper包

这个包用来存放对书架的各种操作,例如查找图书,新增图书,删除图书等多种操作。

IOperation接口

提供这个接口是对books数组的操作,后面通过传入数组下标来调用各种对应的功能。

package Oper;

import book.Booklist;

public interface IOperation {
     void work(Booklist booklist);

}

Showoperation类(显示图书)

package Oper;

import book.Booklist;

public class ShowOperation implements IOperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("显示图书:");
       int length= booklist.getUsedsiae();
        for (int i = 0; i <length ; i++) {
            System.out.println(booklist.getBooks(i));
        }
    }
}

FindOperation类(查找图书)

查找功能和遍历类似,只要利用equals关键字比较字符串输出就可以了。 在Findioperation 类中,先输入要查找的书名,遍历所有的书,比较书名,书名一样输出即可。

package Oper;

import book.Book;
import book.Booklist;

import java.util.Arrays;
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 str=scanner.nextLine();
        System.out.println(str);
        int length=booklist.getUsedsiae();
        int b=0;
        for (int i = 0; i <length ; i++) {
            Book book=booklist.getBooks(i);
          if (book.getName().equals(str)){
              System.out.println("找到了这本书");
              System.out.println(book);
              b++;
              break;

          }

          }
        if(b==0) {
            System.out.println("没有找到");
        }

    }

}

Addoperation类(添加图书)

检查 booklist 数组中有没有即将新增的图书,如果有就不再添加,如果没有检查书架是否溢出,如果没有,添加成功。注意,代码里多了这样一行代码  scanner.nextLine();,这个并不是写错,是为了吸收前面在键盘上输入的回车键,如果没有这一行,那么后面的属性值将无法输入直接结束输入。可以采用另一种方法解决,将int类型的都放在String类型前面也可以解决。

package Oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class AddOperation implements IOperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("新增图书");
        System.out.println("请输入你要添加的图书名:");

        Scanner scanner=new Scanner(System.in);
        String str= scanner.nextLine();

        System.out.println("请输入书的作者");
        String str1= scanner.nextLine();

        System.out.println("请输入书的价格");
        int price= scanner.nextInt();

        scanner.nextLine();

        System.out.println("请输入书的属性");
       String str3=scanner.nextLine();

        Book book=new Book(str,str1,price,str3);
        for (int i = 0; i < booklist.getUsedsiae() ; i++) {
            Book book1=booklist.getBooks(i);
            if (book1.getName().equals(str)){
                System.out.println("已经有这本书了,不能存放");
                return;
            }}
            if(booklist.getUsedsiae() == booklist.getBooks().length) {
                System.out.println("书架满了,不能操作");
            }
            else{
                int b=booklist.getUsedsiae();
                booklist.setBooks(b,book);
                System.out.println("添加成功");
                booklist.setUsedsiae(booklist.getUsedsiae()+1);
            }

        }

    }

Exitoperation类(退出系统)

这个功能实现就比较简单了,System.exit(0;即可。

package Oper;

import book.Booklist;

public class ExitOperation implements IOperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("退出系统");
        System.exit(0);
    }
}

Deloperation类(删除图书)

思路:先找到有没有这本书,然后数组后边的数据从后往前直接覆盖掉想要删除的数据,然后将最后一个数据置空就可以了。

package Oper;

import book.Book;
import book.Booklist;

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 str= scanner.nextLine();
        int max=booklist.getUsedsiae();
        int b=0;
        for (int i = 0; i <max ; i++) {
            Book book1 =booklist.getBooks(i);
            if (book1.getName().equals(str)==false){
               b++;
            }

        }
        if (b==max){
            System.out.println("没有你要删除的书");
        }
        for (int i = 0; i <max ; i++) {
            Book book =booklist.getBooks(i);
            if (book.getName().equals(str)){
                for (int j = i; j <max ; j++) {
                    booklist.setBooks(j);
                }
                System.out.println("删除成功");
                booklist.setBooks(max-1,null);
                booklist.setUsedsiae(max-1);
                break;
            }
        }
    }
}

Browoperation类(借阅图书)

借阅图书实现起来相对比较容易,输入要借阅的书名,如果有这本书,将这本书的
isBorrowed 置为 true 就可以了。

import book.Booklist;

import java.util.Scanner;

public class BrrowOperation implements IOperation{
    @Override
    public void work(Booklist booklist) {
        System.out.println("借阅图书");
        System.out.println("你要借阅哪本书");
        Scanner scanner=new Scanner(System.in);
        String str= scanner.nextLine();
        int b=0;
      int max=  booklist.getUsedsiae();
        for (int j = 0; j <max ; j++) {
            Book book1 =booklist.getBooks(j);
            if (book1.getName().equals(str)==false){
               b++;
            }
            }
        if (b==max){
            System.out.println("没有你要借阅的书");}
        for (int i = 0; i <max ; i++) {
           Book book =booklist.getBooks(i);
           if (book.getName().equals(str)){
               book.setBorrowed(true);
               System.out.println("借阅成功");
               break;
           }
            
        }
    }
}

Returnoperation类(归还图书)

和借阅图书功能一样,将isBorrowed置为true就可以了

import book.Book;
import book.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 str=scanner.nextLine();
        int max=booklist.getUsedsiae();
        for (int i = 0; i < max; i++) {
            Book book=booklist.getBooks(i);
            if (book.getName().equals(str)){
                book.setBorrowed(false);
                System.out.println("归还成功");
                break;
            }

        }
    }
}

Main方法

mport user.User;
 import user.AdminsUer;
import java.util.Scanner;

public class Test {
    public static User login(){
        System.out.println("请输入你的姓名:");
        Scanner scanner=new Scanner(System.in);
        String str= scanner.nextLine();
        System.out.println(str);
        System.out.println("请选择你的身份:1->管理员 2->普通用户");
        int number= scanner.nextInt();
        if (number == 1) {
         return new AdminsUer(str);

        }
        else {
         return new NormolUser(str);

        }
    }
    public static void main(String[] args) {
        Booklist booklist=new Booklist();
        User user=login();
        while(true) {
            user.dowork(user.menu(), booklist);
        }

    }
}

  • 44
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值