【Java】图书管理系统 超简单

主要内容

开发一个图书信息管理系统,图书信息包括:书名、作者、类别、价格、是否借出等基本信息(也可以根据自己情况进行扩充,比如出版社、库存量等)。使之能提供以下基本功能:

(1)添加书籍

(2)删除书籍

(3)更新书籍

(4)查询书籍

(5)显示书籍列表

(6)借书

(7)还书

思维导图(设计框架)

建包结构

具体代码

1.建立Book包中的book类,用于存放书籍的所有属性,优点在于可以方便的添加属性~并且重写了toString方法,让图书信息按照我们所要求的格式输出。

package book_management.book;

/**
 * 书本类
 */
public class Book {
    private String name;
    private String author;
    private double price;
    private String type;
    private boolean isBorrow;

    public Book(String name, String author, double 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 double getPrice() {
        return price;
    }

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

    public String getType() {
        return type;
    }

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

    public boolean isBorrow() {
        return isBorrow;
    }

    public void setBorrow(boolean borrow) {
        isBorrow = borrow;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrow=" + isBorrow +
                '}';
    }
}

 2.建立Book包中的bookList类,用于存放所有的书籍,以及对书籍进行操作的方法。并且建立了静态代码块,让四大名著初始化于书架当中。

package book_management.book;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 书架类
 */
public class BookList {
    Scanner scanner = new Scanner(System.in);
    private static List<Book> books = new ArrayList<>();
    private static List<String> bookname = new ArrayList<>();

    static {
        books.add(new Book("三国演义", "罗贯中", 66.6, "小说"));
        books.add(new Book("水浒传", "施耐庵", 77.7, "小说"));
        books.add(new Book("红楼梦", "曹雪芹", 88.8, "小说"));
        books.add(new Book("西游记", "吴承恩", 99.9, "小说"));

        bookname.add("三国演义");
        bookname.add("水浒传");
        bookname.add("红楼梦");
        bookname.add("西游记");
    }

    public boolean contains(String bookname) {
        return BookList.bookname.contains(bookname);
    }

    public Book returnNameBook(String bookname) {
        for (Book book : books) {
            if (book.getName().equals(bookname)) {
                return book;
            }
        }
        return null;
    }

    public void add(Book book){
        books.add(book);
        bookname.add(book.getName());
    }


    public void remove(Book book) {
        books.remove(book);
        bookname.remove(book.getName());
    }

    public void listbook() {
        for(Book book : books){
            System.out.println(book);
        }
    }

    public void borrow(Book book) {
        book.setBorrow(true);
    }


    public void returnBook(Book book) {
        book.setBorrow(false);
    }

    public void find(Book book) {
        System.out.println(book);
    }

    public void update(Book book) {
        System.out.print("请输入价格:");
        book.setPrice(scanner.nextInt());
        System.out.print("请输入类型:");
        book.setType(scanner.next());
    }
}

其中,books存放了所有当前书架中的书,每个Book对象就是一本书的实体。通过booksname存放了所有的书本名称 - 可以通过查询书籍通过书名来操作。

    private static List<Book> books = new ArrayList<>();
    private static List<String> bookname = new ArrayList<>();

此处为何使用static修饰这两个属性呢?

首先要知道static的特点:所有对象共享此变量 ~

若不是static变量,每当产生一个BookList对象,每个对象都有自己的books属性 ,向books中添加一本新的书籍时,对于其他的BookList对象而言是不可见的这样是不合理的。

3.建立操作书架的接口,因为我们之后要面向对象--管理员和用户,而且不同对象的功能不同,此时需要考虑的多态了,可以通过接口的引用调用这个类重写接口的方法,这些类就可以实现一个共同的接口IOperation,让这个接口定义一个work方法,其他的类都去重写这个方法,那么我们就可以通过接口调用这些方法了。

package book_management.operation;

import book_management.book.BookList;

import java.util.Scanner;

public interface IOperation {
    Scanner scanner = new Scanner(System.in);
    void work(BookList bookList);
}

4.建立User类,抽象类。

package book_management.operation;

import book_management.book.BookList;

import java.util.Scanner;

public interface IOperation {
    Scanner scanner = new Scanner(System.in);
    void work(BookList bookList);
}

其中这一条是接口数组,而不是具体的类,接口数组里的成员则可以是实现这个接口的类,这就意味着当我们数组里的成员不同时,可以调用的方法也将不同。达到了面向对象的目的。

    protected IOperation[] operations;

为何要把具体的操作抽象一层接口,而不使用具体的类呢?

是为了方便扩展和修改对书籍的操作~~

5.建立Admin和NormalUser

package book_management.user;

import book_management.operation.IOperation;
import book_management.operation.impl.*;

import java.util.Scanner;

public class Admin extends User{
    Scanner scanner = new Scanner(System.in);

    public Admin(String name) {
        this.name = name;
        this.operations = new IOperation[]{
                new AddOperation(),
                new RemoveOperation(),
                new UpdateOperation(),
                new FindOperation(),
                new ListOperation()
        };
    }

    @Override
    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("5.显示当前书籍列表");
        System.out.println("-1.退出");
        System.out.print("请输入你的选择:");
        int choice = scanner.nextInt();
        if(choice == -1){
            scanner.close();
            //关闭输入
        }
        System.out.println("===========================================");
        return choice;
    }
}
package book_management.user;

import book_management.operation.IOperation;
import book_management.operation.impl.BorrowOperation;
import book_management.operation.impl.FindOperation;
import book_management.operation.impl.ListOperation;
import book_management.operation.impl.ReturnOperation;

import javax.swing.*;
import java.util.Scanner;

public class NormalUser extends User {
    Scanner scanner = new Scanner(System.in);

    public NormalUser(String name) {
        this.name = name;
        this.operations = new IOperation[]{
                new ListOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }


    @Override
    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("-1.退出");
        System.out.print("请输入你的选择:");
        int choice = scanner.nextInt();
        if(choice == -1){
            scanner.close();
            //关闭输入
        }
        System.out.println("===========================================");
        return choice;
    }
}

6.最后根据需求,编写各个功能,写在impl包当中,以下以添加书籍为例展示代码:

package book_management.operation.impl;

import book_management.book.Book;
import book_management.book.BookList;
import book_management.operation.IOperation;

/**
 * 添加书籍
 */
public class AddOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("您现在进行的是添加书籍操作");
        System.out.println("请输入书籍名称");
        String name = scanner.next();
        if(bookList.contains(name)){
            System.out.println("书本已存在");
            return;
        }
        System.out.println("请输入作者:");
        String author = scanner.next();
        System.out.println("请输入价格:");
        double price = scanner.nextDouble();
        System.out.println("请输入书籍类别:");
        String type = scanner.next();
        Book book = new Book(name,author,price,type);
        bookList.add(book);
        System.out.println("添加成功~~");
    }
}

7.Main包

在通过一个循环可以调用这些方法,直至退出系统。

建立一个login方法,用于接收User类型的参数,如果是管理员则为new Administrator();普通用户则为new Normaluser();

package book_management;


import book_management.book.BookList;
import book_management.user.AdminUser;
import book_management.user.NormalUser;
import book_management.user.User;


import java.util.Scanner;

public class Main {
    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        User user = login();
        BookList bookList = new BookList();
        while (true){
            int choice = user.menu();
            if(choice == -1){
                System.out.println("拜拜~~");
                break;
            }  
            user.doOperation(choice,bookList);
        }
    }

    public static User login(){
        System.out.println("请输入用户名:");
        String name = scanner.next();
        System.out.println("请选择您的角色,1表示普通用户,0表示管理员");
        int choice = scanner.nextInt();
        if(choice == 1){
            return new NormalUser(name);
        }else {
            return new AdminUser(name);
        }
    }
}

如有疑问欢迎留言~

(来自不会敲代码的卑微贝贝)

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值