Java实现图书管理系统

我们先做一个简单的需求分析
简单图书馆管理系统

1.需求分析
a)角色有两种:普通用户 管理员

针对普通用户,支持的操作是

a)查找书籍
b)借阅书籍
c)归还书籍

针对管理员,支持的操作是:

a)查找书籍
b)增加书籍
c)删除书籍
d)打印所有书籍信息

2.概要设计

想清楚程序应该分为几个模块,每个模块具体实现什么功能,模块之间是怎么交互的。

3.详细设计

每个模块的具体细节

4.开始编码

先创建类,把一些核心的类设计好
设计类不难,从需求中寻找关键词(名词)
这里 Book User (NormalUser Admin) BookList(所有书籍)

创建Book类:

package package_bookmanger.book;

public class Book {
    private String name;
    private String id;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;

    public Book(String name, String id, String author, int price, String type, boolean isBorrowed) {
        this.name = name;
        this.id = id;
        this.author = author;
        this.price = price;
        this.type = type;
        this.isBorrowed = isBorrowed;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

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

    public boolean isBorrowed() {
        return isBorrowed;
    }

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

创建BookList类代表一系列图书
在BookList中我们先添加几本书将其初始化

package package_bookmanger.book;

public class BookList {
    private Book[] books = new Book[100];
    private int size; //有效元素

    public BookList() {
        books[0] = new Book("红楼梦","001","曹雪芹",100,"古典文学",false);
        books[1] = new Book("水浒传","002","施耐庵",100,"古典文学",false);
        books[2] = new Book("西游记","003","吴承恩",100,"古典名著",false);
        size = 3;    
    }

    public int getSize() {
    	//取得有效书籍个数
        return size;
    }

    public void setSize(int size) {
    	//设置有效书籍个数
        this.size = size;
    }
    public Book getBook(int index){
    	//取到图书馆中的某本书,通过下标获得
        return books[index];
    }
    public void setBooks(int index,Book book){
    	//设置某本书进去
        books[index] = book;
    }
}

针对两种类型的人,要实现一些基本操作,可以通过两种方式来实现
1.把这些操作作为User类方法来实现
2.可以把操作理解成名词,每种操作对应到一个类,User类只要持有这些类的实例就行了。

这里我们创建一个接口,和许多个操作类

package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

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

此时User就要持有IOpeartion对象来实现操作
新增操作

//新增
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class AddOperation implements IOperation {
    //这个类对应到“新增”操作
    @Override
    public void work(BookList bookList) {

    }
}
//借书
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class BorrowOpeartion implements IOperation{
    @Override
    public void work(BookList bookList) {

    }
}
//删除书
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class DelOperation  implements IOperation{
    @Override
    public void work(BookList bookList) {

    }
}
//退出系统
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class ExitOperation implements IOperation {
    @Override
    public void work(BookList bookList) {

    }
}
//查找书籍
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class FindOperation implements IOperation {
    @Override
    public void work(BookList bookList) {

    }
}
//打印所有书籍
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class PrintAllOpeartion implements IOperation {
    @Override
    public void work(BookList bookList) {

    }
}
//还书
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class ReturnOperation implements IOperation {
    @Override
    public void work(BookList bookList) {

    }
}

book包:
Book:表示一本书的信息
BookList:管理若干本书
user包:
User:抽象类,包含名字和该用户支持的操作数组
NormalUser表示普通用户,继承自User
Admin:表示管理员继承自User
operation包
包含若干个类,每个类表示一种操作。
IOperation为共同接口,重写work方法,work是针对workList进行操作
使每个用户持有不同的操作

在这里插入图片描述

User

package package_bookmanger.user;

import package_bookmanger.Operation.IOperation;
import package_bookmanger.book.BookList;

abstract public class User {
    //被继承
    protected String name;

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

    //持有当前用户支持的操作对象
    protected IOperation[] operations;

    //打印一个操作菜单,不同的用户不同,对应的菜单也不同
    abstract public int menu();

    //根据用户输入的选项
    //调用对应的操作对象
    public void doOperation(int choice, BookList bookList){
        operations[choice].work(bookList);
    }
}

NormalUser

package package_bookmanger.user;

import package_bookmanger.Operation.*;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        //构造器构造我们的数组
        //数组中 operation 对象的顺序和菜单中的序号想匹配
        operations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOpeartion(),
                new ReturnOperation()
        };
    }

    @Override
    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;
    }
}

Admin

package package_bookmanger.user;

import package_bookmanger.Operation.*;

import java.util.Scanner;

public class Admin extends User{
    public Admin(String name) {
        super(name);
        operations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new PrintAllOpeartion()
        };
    }

    @Override
    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;
    }
}

接下来就是实现类的操作

//公共接口
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public interface IOperation {
    void work(BookList bookList);

}

//Add
package package_bookmanger.Operation;

import package_bookmanger.book.Book;
import package_bookmanger.book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation {
    //这个类对应到“新增”操作
    @Override
    public void work(BookList bookList) {
        System.out.println("请新增一本书籍");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名");
        String name = scanner.next();
        System.out.println("请输入序号");
        String id = scanner.next();
        System.out.println("请输入作者");
        String author = scanner.next();
        System.out.println("请输入价格");
        int price = scanner.nextInt();
        System.out.println("请输入类别");
        String type = scanner.next();
        Book book = new Book(name,id,author,price,type,false);
        bookList.setBooks(bookList.getSize(),book);//尾插
        bookList.setSize(bookList.getSize() + 1);
        System.out.println("添加成功");
    }
}
//删除
package package_bookmanger.Operation;

import package_bookmanger.book.Book;
import package_bookmanger.book.BookList;

import java.util.Scanner;

public class DelOperation  implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除书籍");
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入要删除书籍的序号");
        String id = scanner.next();
        int i  = 0;
        for (;i < bookList.getSize(); i++ ){
            Book book = bookList.getBook(i);
            if(book.getId().equals(id)){
                break;//找到了
            }
        }
        if(i >= bookList.getSize()){
            //没找到
            return;
        }
        bookList.setBooks(i,bookList.getBook(bookList.getSize()-1));
        bookList.setSize(bookList.getSize() - 1);
        System.out.println("删除成功");
    }
}
//借阅
package package_bookmanger.Operation;

import package_bookmanger.book.Book;
import package_bookmanger.book.BookList;

import java.util.Scanner;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅书籍");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要借阅书籍的编号");
        String id = scanner.next();
        for (int i = 0; i < bookList.getSize(); i++) {
            Book book = bookList.getBook(i);
            if(!book.getId().equals(id)){
                continue;
            }
            //相等执行借书操作
            if(book.isBorrowed()){
                System.out.println("这本书已经被借走了");
                break;
            }
            book.setBorrowed(true);
            System.out.println("借阅成功");
        }
    }
}
//退出
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class ExitOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("GoodBye");
        System.exit(0);
    }
}
//查找书籍
package package_bookmanger.Operation;

import package_bookmanger.book.Book;
import package_bookmanger.book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("查找书籍");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入查找的书名");
        String name = scanner.next();
        int count = 0;
        for (int i = 0;i < bookList.getSize();i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println(book);
                count++;
            }
        }
        if(count == 0){
            System.out.println("查无此书");
        }
    }
}
//打印所有书籍
package package_bookmanger.Operation;

import package_bookmanger.book.BookList;

public class PrintAllOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        for (int i = 0; i < bookList.getSize(); i++) {
            System.out.println(bookList.getBook(i));
        }
        System.out.println("一共 " + bookList.getSize() + " 本书");
    }
}
//归还图书
package package_bookmanger.Operation;

import package_bookmanger.book.Book;
import package_bookmanger.book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("归还书籍");
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入具体归还书籍的编号");
        String id = scanner.next();
        for (int i = 0; i < bookList.getSize(); i++) {
            Book book = bookList.getBook(i);
            if(!book.getId().equals(id)){
                continue;
            }
            if(!book.isBorrowed()){
                System.out.println("这本书已经被归还");
                break;
            }
            book.setBorrowed(false);
            System.out.println("归还成功");
        }
    }
}

主程序:

package package_bookmanger;

import package_bookmanger.book.BookList;
import package_bookmanger.user.Admin;
import package_bookmanger.user.NormalUser;
import package_bookmanger.user.User;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //程序的入口
        //1.准备好书籍信息数据
        BookList bookList = new BookList();
        //2.创建用户(多态)
        User user = login();
        // 3.进入主循环
        while (true){
            int choice = user.menu();
            user.doOperation(choice,bookList);
        }
    }
    public static User login(){
        System.out.println("请输入您的姓名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        System.out.println("请输入您的角色 (1 普通用户 2 管理员)");
        int role = scanner.nextInt();
        if(role == 1){
            return new  NormalUser(name);
        }else {
            return new Admin(name);
        }
    }
}

问题,切换 booklist构造器为空
return new book 啥时候new,啥时候不new

public static User login(){
        System.out.println("请输入您的姓名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        System.out.println("请输入您的角色 (1 普通用户 2 管理员)");
        int role = scanner.nextInt();
        if(role == 1){
            return new  NormalUser(name);
        }else {
            return new Admin(name);
        }
    }
}
  public Book getBook(int index){
        return books[index];
    }
  • 25
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值