【JavaSE篇】——图书管理系统

本文详细描述了一个使用JavaSE技术实现的图书管理系统,包括管理员和普通用户的操作功能,如增删改查、借阅归还等,以及类结构和核心操作接口的设计与实现。
摘要由CSDN通过智能技术生成

目录

一.前言

二.实现效果

2.1.管理员效果

2.2 普通用户效果

三.整体框架

四.具体实现

4.1.用户(user)

4.1.1.管理员(ManagerUser)

4.1.2.普通用户(NormalUser)

4.2.书(book)

4.2.1.书(book)

4.2.2.书架(BookList)

4.3.操作(operation)

4.3.1操作接口(IOperation)

4.3.2 增加图书(Add)

4.3.3 借阅图书(Borrow)

4.3.4 删除图书(Delete)

4.3.5.退出系统(Exit)

4.3.6.查找图书(Find)

4.3.7.归还图书(return)

4.3.5 显示图书(Didplay)

4.4.Main()函数

一.前言

近期使用JAVASE中的继承、封装、数组、接口、重载、类和对象等知识实现了一个《图书管理系统》小项目,该项目将JAVASE的许多内容充分的整合在一起,现将其分享,有利于初学者进一步理解JAVA面向对象。

二.实现效果

管理员和普通用户都能够通过相应的操作选择,从而实现相应的功能。

2.1.管理员效果

2.2 普通用户效果


三.整体框架

 思路:

  • (1)我们要创建一个Book类来定义一本图书以及Booklist类来作为书架存放Book。
  • (2)创建User类来完成不同用户的选择操作,因为要分成管理员和用户两个类,所以User类我们定为抽象类并定义好操作方法(根据后续不同使用者的输入选择对应的操作),管理员和用户在继承User类之后,我们只需要在他们各自的类里面在构建父类User的抽象方法。
  • (3)所有操作都是对Booklist书架来操作的,创建Operation接口,实现一个操作方法,各种操作都重写接口中的方法,方便我们统一调度。 
  • (4)创建book包、operation包、user包 方便代码的查阅和管理  

首先我们对图书管理系统首先是通过用户来进行对书和操作进行。

四.具体实现

4.1.用户(user)

我们在这里首先实现了一个父类User,用于子类管理员和普通用户的继承,因为管理员和普通用户具有相同的属性,通过继承可以更加清晰明了,也有利于后续用户实现各自的功能!

在父类中,要定义一个IOperation数组,该数组是用来存贮管理员和普通用户各自的功能选择的。另外doOperations方法,是用来根据用户的功能选择,进而对书架(bookList)进行相应的操作实现。

package User;

import Book.BookList;
import Operations.IOperation;

public abstract class User {
   protected String name;
   //解决了choice的值对应的哪个接口
    protected IOperation[] iOperations;//接口数组
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();//抽象方法菜单,用于子类重写
    public void doOperations(int choice, BookList bookList){
        iOperations[choice].work(bookList);
    }
}

4.1.1.管理员(ManagerUser)

package User;

import Operations.*;

import java.util.Scanner;

public class ManageUser extends User{
    public ManageUser(String name) {
        super(name);
        iOperations=new IOperation[] {
                new Exit(),//0 退出系统
                new Find(),//1 查找图书
                new Add(),//2  增加图书
                new Delete(),//3  删除图书
                new Display(),//4  展示图书
        };
    }
    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. 退出系统");
        System.out.println("*****************************");
        System.out.println("请输入你的操作: ");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

4.1.2.普通用户(NormalUser)

package User;

import Operations.*;

import java.util.Scanner;

public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
        iOperations=new IOperation[] {
                new Exit(),
                new Find(),
                new Borrow(),
                new Return(),
        };
    }
    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("0. 退出系统");
        System.out.println("****************************************");
        System.out.println("请输入你的操作: ");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

AdmainUser和NormalUser两个类继承父类User的IOperation数组,用于根据菜单(menu)顺序来存储功能选择,这也是设计的巧妙之处!

管理员和普通用户两个对象,各自的功能不同,在各自的类中menu方法有所包含,这样也一目了然!


4.2.书(book)

4.2.1.书(book)

Book类中包含了name、autther、price、type、isBorrowed这五个成员属性,以及各自的get和set方法,用于其他对象能够对图书(book)进行赋值取值。

由于图书默认为未借出状态,所以构造方法中并没有isBorroed该属性。

在该类中,重写了toString方法,用于返回图书(book)。

package Book;

public class Book {
    private String name;
    private String auther;
    private int price;
    private String type;
    private boolean isBorrowed;//默认是false

    public Book(String name, String auther, int price, String type) {
        this.name = name;
        this.auther = auther;
        this.price = price;
        this.type = type;
    }

    public String getName() {
        return name;
    }

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

    public String getAuther() {
        return auther;
    }

    public void setAuther(String auther) {
        this.auther = auther;
    }

    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 + '\'' +
                ", auther='" + auther + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +"  "+
                  ((isBorrowed==true)? "该书已借出":"该书未借出")+
                "}"
                ;
    }
}

4.2.2.书架(BookList)

BookList类中 DEFAULT_SIZE 是一个常量,方便更改BookList的长度。

这里包含了方法的重载,有两个setBook方法,第一个是直接在当前下标下设置图书,第二个是用于在Del类中挪动数据。

usedSize变量是用于记录当前books数组当中,有多少本书。在功能操作中,将通过其get和set方法,可以得到和设置书的数量,这两个方法在归还图书和借阅图书中会使用到。

package Book;

import java.util.Arrays;

public class BookList {
    private Book[] books=new Book[10];
    private int usedSize;//存储当前书的个数

    //事先通过构造方法,初始化的时候,给数组里面预留3本书 usedSize=3;
    public BookList(){
        books[0]=new Book("三国演义","罗贯中",89,"小说");
        books[1]=new Book("西游记","吴承恩",78,"小说");
        books[2]=new Book("红楼梦","曹雪芹",49,"小说");
        usedSize=3;
    }
    public int getUsedSize() {
        return usedSize;
    }//得到书的当前数量(因为usedSize是private的,需要调用)
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }//
    public Book getPos(int pos){
        return books[pos];
    }//返回下标代表的书

    @Override
    public String toString() {
        return "BookList{" +
                "books=" + Arrays.toString(books) +
                ", usedSize=" + usedSize +
                '}';
    }
    public void setBooks(Book book,int pos){
        books[pos]=book;
    }
}

4.3.操作(operation)

4.3.1操作接口(IOperation)

由于管理员和普通用户两个对象都要进行功能选择,同时,他们的作用对象都是bookList,所以在这里,我们定义了一个IOperation接口,所有的操作都继承于它。

在这个接口内有一个work方法。通过继承,每个操作都重写了各自的work方法,进而实现各自的功能。

package Operations;

import Book.BookList;

public interface IOperation {
    void work(BookList bookList);
}

4.3.2 增加图书(Add)

package Operations;

import Book.Book;
import Book.BookList;

import java.util.Scanner;
        public class Add implements IOperation{
            @Override
            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();
                for (int i = 0; i < currentSize; i++) {
                    Book temp = bookList.getPos(i);
                    if(temp.getName().equals(name)) {
                        System.out.println("已经存在,不能增加!");
                        return;
                    }
                }
                //把书放到指定的位置
                bookList.setBooks(book,currentSize);
                //修改usedSize
                bookList.setUsedSize(currentSize+1);
            }
        }

4.3.3 借阅图书(Borrow)

借阅图书时,需要将isBorrowed置为ture,只有置为ture才能显示该本图书的状态为“被借出”,这样才能成功借阅图书。

package Operations;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class Borrow implements IOperation{
    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())){
                if(book.isBorrowed()){
                    System.out.println("该书已经被借出!");
                }
                else {
                    book.setBorrowed(true);
                    System.out.println("借阅图书成功");
                }
                return;
            }
        }
        System.out.println("没有你要借阅的图书");
    }
}

4.3.4 删除图书(Delete)

在这个功能里,找到需要删除的图书之后,需要将此书在bookList这个数组里一步一步往后挪动,最后直接将最后一个图书置为null,这样就达到了删除图书的目的。与此同时,在这里就需要将bookList的长度减1。

package Operations;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class Delete implements IOperation{
    public void work(BookList bookList){
        //删除图书
        System.out.println("删除图书");
        System.out.println("请输入你要删除的图书:");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        //遍历下标,看看是否有你要删除的图书
        int index=-1;
        int currentSize=bookList.getUsedSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getPos(i);
            if(name.equals(book.getName())){
                index=i;
                break;
            }
            //如果你输入的名字和遍历中的某个下标的名字相等,那么我们将下标给index
        }
        if(index==-1){
            System.out.println("没有你要删除的图书");
            return;
        }
        //从index开始
        for (int i = index; i <currentSize-1 ; i++) {
            Book book=bookList.getPos(i+1);//我们将i下一个位置赋值给book
            bookList.setBooks(book,i);//然后给book的值给下标对应i
        }

        //每次删除都要置空
        bookList.setBooks(null,currentSize-1);
        //然后更新当前大小
        bookList.setUsedSize(currentSize-1);
        System.out.println("删除成功");
    }
}

4.3.5.退出系统(Exit)

package Operations;

import Book.BookList;

public class Exit implements IOperation{
    public void work(BookList bookList){
        //退出系统
        System.out.println("退出系统");
        System.exit(0);
    }
}

4.3.6.查找图书(Find)

次遍历,找到此时的名字和书的名字 相同。

package Operations;

import Book.BookList;
import Book.Book;
import java.util.Scanner;

public class Find implements IOperation{
    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())){
                System.out.println("找到了这本书");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到这本书");
    }
}

4.3.7.归还图书(return)

依次遍历,输入归还的书的名字,如果匹配那么就将借出状态改成未借出状态。

归还图书时,需要将isBorrowed置为false,只有置为false才能显示该本图书的状态为“未借出”,这样才能成功归还图书。

package Operations;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class Return implements IOperation{
    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("归还图书成功");
                return;
            }
        }
    }
}

4.3.5 显示图书(Didplay)

通过for循环遍历bookList打印图书即可。这里值得一提的是,打印图书需要使用BookList类下的getpos方法得到下标对应的书,然后打印书即可。

package Operations;

import Book.Book;
import Book.BookList;

public class Display implements IOperation{
    public void work(BookList bookList){
        //显示图书
        System.out.println("显示所有图书");
        int currentSize= bookList.getUsedSize();
        for (int i = 0; i <currentSize ; i++) {
            //依次遍历显示所有图书
            Book book=bookList.getPos(i);
            System.out.println(book);
        }
    }
}

4.4.Main()函数

在这里巧妙的设计了一个login函数,其返回值为User,根据操作者的输入,可以返回相应的对象,在主函数中接收其返回值,根据输入的choice和该返回值来调用谁的操作功能。

import Book.BookList;
import User.ManageUser;
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 userName=scanner.nextLine();
        System.out.println("请输入你的身份: 1-》管理员  0-》普通用户");
        int choice=scanner.nextInt();
        if(choice==1){
            return new ManageUser(userName);
        }else{
            return new NormalUser(userName);
        }

    }
    public static void main(String[] args) {
        //0.准备数据
        BookList bookList=new BookList();
        //1.登录
        User user=login();
        while(true)
        {
            int choice=user.menu();
            user.doOperations(choice,bookList);
        }
    }
}


下阶段开始啦~

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值