简单实现图书管理系统

引言

在如今数字化的时代,图书管理系统成为了图书馆、学校和其他组织中不可或缺的一部分。图书管理系统可以帮助管理员轻松地记录和管理图书的借阅、归还等操作,同时也方便读者查询图书信息。本篇博客将介绍如何使用Java语言实现一个简单的图书管理系统。我们将采用面向对象的思想,通过建立各个类和运用接口来实现不同的操作功能。

1. 建立 Book 类 

 我们要实现图书管理系统自然少不了书,所以我们需要创建一个Book类来储存书的信息,例如:书名,作者,价格,类型等等。

public class Book {
    //书的信息是固定的,不需要被改动
    //所以我们这里用private修饰,让它只能在Book类里被访问
    //体现Java的封装特性
    private String name;
    private String author;
    private int price;
    private String type;
    //书会被读者借出,所以我们可以用一个布尔类型来表示书是否被借出了,
    //这里我们默认false是未被借出
    private boolean isBorrowed;  

    //省略构造方法

    //重写toString方法,注意isBorrowed的输出需要做一下改动
    @Override
    public String toString() {
        return "Book{" +
                " 书名:'" + name + '\'' +
                ", 作者:'" + author + '\'' +
                ", 价格:" + price +
                ", 类型:'" + type + '\'' +
                ", 状态:'" + (isBorrowed ? "已被借出'" : "未被借出' " )+
                '}';
    }
    
    //由于我们的成员变量是用private修饰的
    //所以我们需要给出set和get方法来获取成员变量

    public String getName() {
        return name;
    }

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

    //......
}

2. 建立 BookList 类

 我们有了书,自然需要一个书架把这些书整理放起来,所以我们可以实现一个BookList 类用来存放我们的书。

public class BookList {
    //定义一个常量,表示书架的最大容量
    public final static int MaxSize = 10;
    //定义一个Book类型的数组用来储存我们的书
    private Book book[] = new Book[MaxSize];
    private int bookSize;   //记录当前书架上书的数量

    //我们可以在构造方法中给一些初始数据
    public BookList() {
        book[0] = new Book("西游记", "吴承恩", 25, "小说");
        book[1] = new Book("红楼梦", "曹雪芹", 30, "小说");
        book[2] = new Book("水浒传", "施耐庵", 25, "小说");
        this.bookSize = 3;
    }

    //同样的我们也需要set/get方法来访问成员变量
    //不过要注意book的set/get方法的实现
    //为了方便操作我们设置成:返回/设置 指定位置的数据。实现在下方
    public int getBookSize() {
        return bookSize;
    }

    public void setBookSize(int bookSize) {
        this.bookSize = bookSize;
    }

    
    public Book getBook(int pos) {
        return book[pos];
    }

    public void setBook(int pos, Book book) {
        this.book[pos] = book;
    }
}

我们发现 Book 和 BookList 都是用来存放的,所以我们可以创建一个book包,把它们放在一起,使项目的组织结构更加清晰和有序。

简单实现图书管理系统_第1张图片

 3. 建立 Operation 接口

书和书架都有了,接下来我们自然需要实现一些类用来做一些操作。例如,普通用户可以借书,还书,找书,还可以展示图书;管理员用户还可以增加书,删除书等等。我们发现如此多的操作,我们需要调用的时候就要去写调用的代码是不是十分的繁琐,所以我们可以定义一个接口 Operation 然后让这些不同的类去实现这个接口,就可以根据接口类型引用对象,实现对不同实现类的统一调用。

 3.1 实现 Operation 接口

import book.BookList;

public interface Operation {
    //由于我们所有的操作实际上都是对我们的书架进行操作
    //所以我们需要把BookList作为参数传入work方法
    //同时别忘记导入BookList所在的包
    void work(BookList bookList);
}

3.2 实现操作类

import book.BookList;
//这里以展示图书的类为例子
public class ShowOperation implements Operation {
    //由于我们实现了Operation接口所以我们需要重写work方法,
    //这里的work方法我们就可以用来实现对应的操作
    @Override
    public void work(BookList bookList) {
        System.out.println("展示图书");
        //具体的实现在后面给出,我们先把整体的框架搭好
    }
}

同理,我们让其他的操作的类也实现Operation接口。同样的,为了我们的代码组织更为清晰,我们创建一个operation包来存放这些操作相关的代码

 简单实现图书管理系统_第2张图片

4. 建立 User 类及其子类 

用来操作的类有了,那么谁来调用这些操作呢,自然是用户来调用,所以我们可以创建一个User类来储存用户的信息以及调用操作的方法,但是我们上面提到了,普通用户以及管理员用户,他们能实现的操作是不同的,又该怎么办呢? 普通用户是用户,管理员用户也是用户,所以我们可以再创建两个类,NormalUser(普通用户),AdminUser(管理员用户),然后用这两个类继承User类,重写User类中调用操作的方法就可以解决这个问题。

4.1 实现User类

import book.BookList;

import operation.Operation;
//既然User只需要被继承那么我们可以把User设计为抽象类
public abstract class User {
    protected String name;//用户的姓名

    public Operation[] op; //可以调用的操作有多种,所以我们可以用数组存储对应的类

    public User(String name) {
        this.name = name;
    }

    public abstract int menu(); //设计一个菜单界面(返回值为Int的原因后面会讲)

    //用来调用具体操作的方法
    //根据传入的操作代号,来调用op中对应类中的work方法
    public void doOperation(int choice, BookList bookList) {
        this.op[choice].work(bookList);
    }
}

4.2 实现 NormalUser 类

import java.util.Scanner;

import operation.*;
public class NormalUser extends User {
    //宅构造方法中初始化User类中的数组op,存入对应的操作的类
    //位置与下面菜单中的操作代数对应
    public NormalUser(String name) {
        super(name);
        super.op = new Operation[] {
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
                new ShowOperation()
        };
    }

    //重写父类中的menu
    @Override
    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. 退出系统");
        System.out.println("*****************");
        //提示用户输入,然后返回对应操作的代数
        System.out.println("请选择你的操作");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

 4.3 实现 AdminUser 类

import operation.*;

import java.util.Scanner;

//与上面Normal类的实现类似,只是传给op的类以及菜单界面不同
public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
        super.op = new Operation[] {
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };
    }
    @Override
    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. 退出系统");
        System.out.println("*****************");
        System.out.println("请选择你的操作");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

 同样的,我们也创建一个包 user 把这三个类放进去

5. 程序入口 

我们所有的框架基本已经写好了,现在只需要写一个程序入口来把这些代码运行起来。

 我们写一个Main类

import book.BookList;
import user.*;
import operation.*;
import java.util.Scanner;

public class Main {
    //要使用这个系统,首先要有用户
    //但是用户分为,普通用户和管理员用户
    //所有我们写一个登录方法来区分用户的类别
    public static User login() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份 :0(用户)  or   1(管理员)");
        int identity = scanner.nextInt();
 
        if(identity == 1) {
            System.out.println("管理员");
            return new AdminUser(name);
        } else {
            System.out.println("用户");
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {
        //用一个User变量来接收login返回的用户
        User user = login(); 
        //有了用户我们还需要创建一个书架
        BookList bookList = new BookList();
        
        //我希望选择了一个操作之后,还能进行其他操作,所以这里用一个循环
        while(true) {
            //这里打印了菜单界面的同时接收到了menu返回的操作代数
            int choice = user.menu();
            //然后调用User中的doOperation方法来调用相关操作
            user.doOperation(choice, bookList);
        }
    }
}

现在这个代码基本上就算写完了,只需要把操作类具体实现就可以了。后面我们还可以在此基础上升级为静态库版本,网页版本。

 6. 操作类的具体实现

 6.1 增加图书

public class AddOperation implements Operation {
    @Override
    public void work(BookList bookList) {
        System.out.println("添加图书");
        if(bookList.getBookSize() == BookList.MaxSize) {
            System.out.println("书架已满,添加失败");
            return;
        }
        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 newBook = new Book(name, author, price, type);
        bookList.setBook(bookList.getBookSize(), newBook);
        bookList.setBookSize(bookList.getBookSize() + 1);
        System.out.println("添加成功");
    }
}

6.2 删除图书

public class DelOperation implements Operation {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        System.out.println("请输入要删除的图书名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int size = bookList.getBookSize();
        for(int i = 0; i < size; i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                for(; i < size-1; i++) {
                    bookList.setBook(i, bookList.getBook(i+1));
                }
                bookList.setBook(i, null);
                bookList.setBookSize(bookList.getBookSize() - 1);
                System.out.println("删除成功");
                return;
            }
        }
        System.out.println("没有图书:" + "'" + name + "'");
    }
}

6.3 借阅图书

public class BorrowOperation implements Operation {
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("借阅图书");
        System.out.println("请输入你要借的图书名称:");
        String name = scanner.nextLine();
        int size = bookList.getBookSize();
        for(int i = 0; i < size; i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                if(bookList.getBook(i).isBorrowed() == false) {
                    bookList.getBook(i).setBorrowed(true);
                    System.out.println("借阅成功");
                    return;
                } else {
                    System.out.println("该书已被借出");
                    return;
                }
            }
        }
        System.out.println("没有图书:" + "'" + name + "'");
    }
}

 6.4 归还图书

public class ReturnOperation implements Operation {
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("请输入你要归还的图书名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int size = bookList.getBookSize();
        for(int i = 0; i < size; i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                if(bookList.getBook(i).isBorrowed()) {
                    bookList.getBook(i).setBorrowed(false);
                    System.out.println("归还成功");
                    return;
                } else {
                    System.out.println("该书未被借出");
                    return;
                }
            }
        }
        System.out.println("没有图书:" + "'" + name + "'");
    }
}

6.5 寻找图书

public class FindOperation implements Operation {
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        System.out.println("请输入要查找的图书名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int size = bookList.getBookSize();
        for(int i = 0; i < size; i++) {
            if(bookList.getBook(i).getName().equals(name)) {
                System.out.println("找到内容如下:");
                System.out.println(bookList.getBook(i));
                return;
            }
        }
        System.out.println("没有图书:" + "'" + name + "'");
    }
}

 6.6 显示图书

public class ShowOperation implements Operation {
    @Override
    public void work(BookList bookList) {
        System.out.println("展示图书");
        int size = bookList.getBookSize();
        for(int i = 0; i < size; i++) {
            System.out.println(bookList.getBook(i));
        }
    }
}

 6.7 退出程序

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

你可能感兴趣的:(java)