【Java】图书管理系统练习

1.前言

主要是通过写博客来巩固一下自己的所学,如有错误的地方,还望指教.

目标

1.利用Java中的语法(抽象类,接口,多态,继承,动态绑定等知识)来完成一个图书管理系统.
2.登录系统的用户分为管理员和普通用户,普通用户拥有查询图书,借阅图书,归还图书,退出系统四个功能. 管理员拥有查询图书,新增图书,删除图书,显示所有图书,退出系统五个功能.

2.构思

1.用户分为管理员和普通用户,所以我们可以把他们的的共性抽取出来,创建一个抽象类.
2.对于图书的操作有很多,所以我们可以提供一个接口,让各种操作来实现这个接口进而完成各种功能.

3.代码实现

3.1 书和书架的实现(放在了Book包中,方便管理)

创建book类用来存储书的各种信息,BookList类当做书架管理书籍.


public class Book {
    private String name;
    private String author;
    private String describe;
    private double price;
    private boolean isBorrowed=false;

    public Book(String name, String author, String describe, double price) {
        this.name = name;
        this.author = author;
        this.describe = describe;
        this.price = price;
    }

    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 String getDescribe() {return describe;}

    public void setDescribe(String describe) {this.describe = describe;}

    public double getPrice() {return price;}

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

    public boolean isBorrowed() {return isBorrowed;}

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

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

1、Book类中包含五个属性[书名,作者,书的描述,价格,是否被借出]。
2、一个构造方法(isBorrowed不用放到构造方法中,因为这个属性随着借入和归还一直变化,所以创建setter方法对他进行修改。
3、重写toString方法,这样打印出来才能看出来书籍信息,不重写的话打印出来的是哈希值。


public class BookList {
    Book[] books=new Book[10];		//这里我设计的最多存放10本书,可以随意
    private int usedSized=3;				
    public BookList(){
        books[0]=new Book("红楼梦","曹雪芹","清代小说",25.0);
        books[1]=new Book("高等数学","XX教授","工科必修",44.0);
        books[2]=new Book("笑傲江湖","金庸","长篇武侠小说",55.0);

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

    public int getUsedSized() {return usedSized;}

    public void setUsedSized(int usedSized) {this.usedSized = usedSized;}

    public void setBooks(int pos, Book book) {
        books[pos]=book;
    }

}

1、BookList类中设置了书的数组,用来存放书。还有当前书的数量。
2、一些方法

  • 获得书架上的某本书【getBooks】
  • 获取当前存储了书的数量【getUsedSized】
  • 修改当前存储的书的数量【setUsedSized】
  • 修改某本书【setBooks】

3.2 、对书架的操作的实现(放在Operation包中)

普通用户拥有查询图书,借阅图书,归还图书,退出系统四个功能。 管理员拥有查询图书,新增图书,删除图书,显示所有图书,退出系统五个功能。
去掉重复的,其实就只有7个功能【新增、删除、查找、借阅、归还、显示所有书籍、退出系统】
内容比较简单,直接上代码

3.2.1 操作接口

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

让那7个功能来实现这个接口,从而完善各自的内容。

3.2.2 新增图书

public class AddOperation implements  IOperation{
    public void work(BookList bookList){
        if(bookList.getUsedSized()==10){
            System.out.println("书架已满,无法新增书籍");
            return;
        }
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入书籍名称");
        String name=sc.next();
        System.out.println("请输入书籍作者");
        String author=sc.next();
        System.out.println("请输入书籍的描述");
        String describe=sc.next();
        System.out.println("请输入书籍价格");
        Double price=sc.nextDouble();
        int pos=bookList.getUsedSized();
        Book book=new Book(name,author,describe,price);
        bookList.setBooks(pos,book);
        bookList.setUsedSized(pos+1);

    }
}

3.2.3 删除图书

public class DeleteOPeration implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getUsedSized()==0){
            System.out.println("删除失败,书架上没有书籍");
            return;
        }
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入书籍名称");
        String name=sc.next();
        for (int i = 0; i < bookList.getUsedSized(); i++) {
            if(name.equals(bookList.getBooks(i).getName())){
                while(bookList.getUsedSized()-i-1!=0){
                    bookList.setBooks(i,bookList.getBooks(i+1));
                    i++;
                }
                bookList.setUsedSized(bookList.getUsedSized()-1);
                System.out.println("删除成功");
                return;
            }
        }
        System.out.println("删除失败,没有这本书");
    }
}

3.2.4 查找图书


public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getUsedSized()==0){
            System.out.println("书库无书");
            return;
        }
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入你要查询的书籍的名称");
        String name=sc.next();
        for (int i = 0; i < bookList.getUsedSized(); i++) {
            if(name.equals(bookList.getBooks(i).getName())){
                System.out.println("查找到该书,信息如下");
                System.out.println(bookList.getBooks(i));
                return;
            }
        }
        System.out.println("查找不到这本书");

    }
}

3.2.5 借阅图书


public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getUsedSized()==0){
            System.out.println("书架没有书");
            return;
        }
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入书名");
        String name=sc.next();
        System.out.println();
        for (int i = 0; i < bookList.getUsedSized(); i++) {
            if (name.equals(bookList.getBooks(i).getName())){
                if(bookList.getBooks(i).isBorrowed()==false){
                    System.out.println("借阅成功");
                    bookList.getBooks(i).setBorrowed(true);
                    return;
                }
                System.out.println("该书已经被借阅");
                return;
            }
        }
        System.out.println("没有该书");
    }
}

3.2.6 归还图书

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入归还书籍的名称");
        String name=sc.next();
        for (int i = 0; i < bookList.getUsedSized(); i++) {
            if(name.equals(bookList.getBooks(i).getName())){
                if(bookList.getBooks(i).isBorrowed()==true){
                    System.out.println("归还成功");
                    bookList.getBooks(i).setBorrowed(false);
                    return;
                }else{
                    System.out.println("该书未被借阅");
                    return;
                }
            }
        }
        System.out.println("没有该书或者书名错误");
    }
}

3.2.7 显示所有书籍

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getUsedSized()==0){
            System.out.println("书架为空");
            return;
        }
        for (int i = 0; i < bookList.getUsedSized(); i++) {
            System.out.println(bookList.getBooks(i));
        }
    }
}

3.2.8退出系统

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

3.3 用户功能的实现(放在User包中)

用户分为管理员和普通用户,我们抽象出管理员和普通用户的共同点创建User类,然后让管理员和普通用户继承User类,再去创建他们特有的属性或方法。

3.3.1 User类

public abstract  class User {
    protected String name;
    protected Operation[] Operations;

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

    public abstract int menu();

    public void doOperation(int choice , BookList bookList){
        iOperations[choice].work(bookList);
    }
}

管理员和普通用户有姓名、这个比较好理解,难点在于下面三段代码

protected IOperation[] iOperations;
//创建这个数组是为了存储操作书架的功能。
public abstract int menu();
//管理员和普通用户的菜单肯定是不一样的,所以让他们自己去重写方法。
public void doOperation(int choice , BookList bookList){
        Operations[choice].work(bookList);
    }
//管理员和普通用户对由于动态绑定,会各自调用各自Operation数组,在后面整合时会比较容易理解。

3.3.2 AdminUser类

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.iOperations=new IOperation[]{new ExitOperation(),new FindOperation(),new AddOperation(),
                new DeleteOPeration(),new DisplayOperation()};
    }
    @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("请输入你要执行的操作");
        Scanner sc=new Scanner(System.in);
        int choice=sc.nextInt();
        return choice;
    }
}

3.3.2 NormalUser类

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOperations=new IOperation[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};
    }
    @Override
    public int menu() {
        System.out.println("====用户菜单====");
        System.out.println("1.查询图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
        Scanner sc=new Scanner(System.in);
        int choice=sc.nextInt();
        return choice;
    }
}

3.4 整合代码

public class Main {
    public static User login(){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入你的姓名");
        String name=sc.next();
        System.out.println("欢迎"+name+"登录系统");
        System.out.println("请问你是管理员(0)还是普通用户(1)");
        int choice=sc.nextInt();
        if(choice==1){
            return new NormalUser(name);
        }else{
            return new AdminUser(name);
        }
    }
    public static void main(String[] args) {
        BookList bookList=new BookList();
        User user=login();
        while(true){
            int choice=user.menu();
            user.doOperation(choice,bookList);
        }
    }
}

我们先看main方法,首先new了一个书架出来,然后创建了login方法,这个方法用来输入你的姓名和判断你是管理员还是普通用户。如果你是普通用户,则new一个NormalUser类并return。我们知道了该用户是普通用户,就可以弄对应的菜单了。

 while(true){
            int choice=user.menu();
            user.doOperation(choice,bookList);
        }

之前user对象接收的是NormalUser子类,所以由于动态绑定user.menu()实际上相当于new NormalUser(name).menu(),因此调用普通用户的菜单,在该用户做出选择后,choice接受到选择的数字,doOperation便可以根据该数字执行对应的操作了。

4.总结

虽然对该代码有了一定的理解,但是语言表述能力还是太差,不过这个图书管理系统实现起来其实也不难,有兴趣的老铁可以实现一下。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值