0
点赞
收藏
分享

微信扫一扫

【JavaSE】----- 图书管理系统练习

洒在心头的阳光 2022-03-24 阅读 38

目录

一、导读

二、主要需求

🍓简单的登录

🍓管理端

🍓用户端

三、类的设计

🍓创建图书相关的类

🍓创建 BookList 类, 用来保存 N 本书

🍓创建相关操作的类

🍓创建用户相关的类

四、进行整合

五、实现具体的每个操作类并完善Main类中的main方法


一、导读

  • 利用前面所学的知识点:类,抽象类,封装,继承,多态,接口等进行的一个代码的练习。通过这个练习,可以加强对面向对象的理解,进一步的掌握所学的知识点。

🍎图书管理系统主要通过四个部分来实现:

  1. book包:对图书基本信息的实现
  2. user包:对用户的信息与逻辑操作的实现。
  3. operation 包:对系统相关操作的实现。
  4. Main 文件:对系统进行整合,搭建整体逻辑。

二、主要需求

🍓简单的登录

🍓管理端

  • 查找书籍
  • 新增书籍
  • 删除书籍
  • 打印(显示)书籍列表
  • 退出系统

🍓用户端

  • 查找书籍
  • 借阅书籍
  • 归还书籍
  • 退出系统

三、类的设计

🍓创建图书相关的类

  • 创建 package book
  • 创建 Book 类, 表示一本书。
  • 图书的信息:书名、作者、价格、类型、是否借出

Book.java

package book;

public class Book {
    private String name; //书名
    private String author; //作者
    private double price; //价格
    private String type; //类型
    private boolean isBorrowed; //是否借出

    //构造方法,在创建图书的时候就是未借出(false)可以不用传 isBorrowed 参数
    public Book(String name, String author, String type,double price) {
        this.name = name;
        this.author = author;
        this.type = type;
        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 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;
    }
    //获取图书是否被借出信息(初始值为 false -> 未被借出)
    public boolean isBorrowed() {
        return isBorrowed;
    }
    //设置图书是否被借出信息(如果被借出就改为true)
    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    @Override
    //重写 toString 方法,打印图书的具体信息。
    //如果不重写,则会调用java中自己的toString方法(打印出来的是对象的地址)
    public String toString() {
        return "Book{" +
                "  书名:'" + name + '\'' +
                ", 作者:'" + author + '\'' +
                ", 价格:'" + price +'\'' +
                ", 类型:'" + type + '\'' +
                ", " + ((isBorrowed==true)? "已借出" :  "未借出") +
                '}';
    }
}

🍓创建 BookList 类, 用来保存 N 本书

BookList.java

public class BookList {
    //顺序表(数组)
    private Book[] books = new Book[10];

    //数组的有效数据个数,记录图书的数量
    private int userSize; 

    //在构造方法中先存储三本书的信息
    public BookList() {
        books[0] = new Book("西游记","吴承恩",57.9,"小说");
        books[1] = new Book("三国演义","罗贯中",85.9,"小说");
        books[2] = new Book("水浒传","施耐庵",77.9,"小说");
        books[3] = new Book("红楼梦","曹雪芹",65.9,"小说");
        this.userSize = 3;
    }

    //获取数组的大小
    public int getUserSize() {
        return userSize;
    }

    //设置数组的大小(新增图书或删除图书,数组的大小都要被改变)
    public void setUserSize(int userSize) {
        this.userSize = userSize;
    }

    /**
     * 获取 pos 位置的一本书
     * @param pos
     * @return
     */
    public Book getPos(int pos){
        if(pos<0 || pos>this.userSize){
            System.out.println("位置不合法");
            return null;
        }
            return this.books[pos];
    }

    /**
     * 在 pos 位置添加一本书
     * @param pos
     * @param book
     */
    public void setBook(int pos,Book book){
        this.books[pos] = book;
    }
}

🍓创建相关操作的类

1、创建 package operation

2、创建相关的操作类, 每个类对应一个用户的动作

  • AddOperation:增加图书
  • DelOperation:删除图书
  • FindOperation:查找图书
  • DisplayOperation:打印图书
  • BorrowOperation:借阅图书
  • ReturnOperation:归还图书
  • ExitOperation:退出系统

IOperation.java (接口)

package operation;

import book.BookList;

import java.util.Scanner;

public interface IOperation {
    void work(BookList bookList);
    //因为在每个操作类中都要输入数据,所以将 scanner 引用定义在接口中
    Scanner scanner = new Scanner(System.in);
}

 AddOperation.java

package operation;

public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书!");
    }
}

DelOperation.java

package operation;

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!");
    }
}

FindOperation.java

package operation;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
    }
}

DisplayOperation.java

package operation;

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书!");
    }
}

BorrowOperation.java

package operation;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
    }
}

ReturnOperation.java

package operation;

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
    }
}

ExitOperation.java

package operation;

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

🍓创建用户相关的类

1、创建 package user

2、因为管理员和用户有很多共性,所以创建 User 父类, 管理员类与普通用户类继承 User 类。

3、每个子类需要做两件事情:

  1. 初始化对应的操作数组
  2. 实现 Menu 菜单

User.java

package user;

import book.BookList;
import operation.IOperation;

public  abstract class User {
    //使用者姓名
    protected String name;
    //创建使用者操作数组,数组中存储相关操作的功能
    protected IOperation[] operations; 
    
    public User(String name) {
        this.name = name;
    }
    //子类继承父类的方法,打印菜单
    public abstract int Menu();

    //根据用户选项,执行对应的操作
    public void doWork(int choice, BookList bookList){
        operations[choice].work(bookList);
    }
}

AdminUser.java

package user;

import operation.*;

import java.util.Scanner;

//管理员
public class AdminUser extends User {
    public AdminUser(String name){
        super(name);
        this.operations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation()
        };
    }
    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("0. 退出系统");
        System.out.println("==========================");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

NomalUser.java

package user;

import operation.*;

import java.util.Scanner;
//普通用户
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.operations = new IOperation[]{
               new ExitOperation(),
               new FindOperation(),
               new BorrowOperation(),
               new ReturnOperation()
        };
    }

    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("0. 退出系统");
        System.out.println("===========================");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

四、进行整合

🎄创建 Main 类和 main 方法, 搭建整体逻辑

1、创建登录方法

  • 输入姓名,选择身份。
  • 登录成功后,返回选择的身份的对象。所以登录的方法(login)返回类型为User
  • 通过向上转型调用登录方法,引用哪个对象,取决于返回的是哪个对象。
  • 通过动态绑定调用子类的菜单,返回的是哪个对象,就调用哪个对象的菜单。
import user.AdminUser;
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 name = scanner.nextLine();
        System.out.println("请输入你的身份(1.表示管理员,0.表示普通用户)");
        int choice = scanner.nextInt();

        //根据choice的值,实例化不同的对象
        if(choice==1){
            /*  向上转型
            User user = new AdminUser(name);
            return user;*/
            return new AdminUser(name);
        }else {
            /*   向上转型
            User user = new NormalUser(name);
            return user;*/
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
            User user = login(); //向上转型
            user.Menu(); //动态绑定(菜单)
    }
}

运行结果

  • 打印完菜单后,根据菜单的内容输入相应数字调用对应的操作。
  • 在User父类中定义一个 IOperation 类型的数组,在子类中对 IOperation 数组实例化。
  • 在User父类中写一个doWork方法,在main方法中通过数组下标来获取对应的操作,实现相应的功能。

五、实现具体的每个操作类并完善Main类中的main方法

 AddOperation.java

  • 新增图书,创建图书并初始化信息,将其放在顺序表最后的位置
package operation;

import book.Book;
import book.BookList;

public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书!");
        System.out.println("请输入图书的名字:");
        String name = scanner.nextLine();
        System.out.println("请输入图书的作者:");
        String author = scanner.nextLine();
        System.out.println("请输入图书的类型:");
        String type = scanner.nextLine();
        System.out.println("请输入图书的价格:");
        double price = scanner.nextDouble();
        //实例化新增图书
        Book book = new Book(name,author,type,price);
        //调用bookList.getUserSize方法,确定新增图书存放的位置
        int size = bookList.getUserSize();
        //在 size 位置放新增的图书
        bookList.setBook(size,book);
        //有效书的数量加1(数组大小加1)
        bookList.setUserSize(size+1);
        System.out.println("图书新增成功!");
    }
}

DelOperation.java

  • 对顺序表进行检查,记录要删除图书的位置(如果没有,直接提示退出),当记录的位置开始遍历顺序表,将后面的元素向前移动。
package operation;

import book.Book;
import book.BookList;

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!");
        System.out.println("请输入要删除的书名:");
        String name = scanner.nextLine();
        int size = bookList.getUserSize();
        int index = 0;
        int i = 0;
        for (; i < size; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                index = i;
                break;
            }
        }
        if(i>=size){
            System.out.println("书架上没有要删除的书");
            return;
        }
        for (int j = index; j < size-1; j++) {
            // j + 1 位置的书放到 j 位置
            Book book = bookList.getPos(j+1);
            bookList.setBook(j,book);
        }
        bookList.setBook(size,null);
        bookList.setUserSize(size-1);
        System.out.println("删除成功!");
    }
}

FindOperation.java

  • 查找图书(对数组进行查找元素的操作),输入书名,找到了就打印该图书的信息;否则就输出查无此数。
package operation;

import book.Book;
import book.BookList;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
        System.out.println("请输入要查找的书名:");
        String name = scanner.nextLine();
        int size = bookList.getUserSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                System.out.println("找到了要查找的书,信息入下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("查无此书");
    }
}

DisplayOperation.java

  • 将已有图书的信息进行打印
package operation;

import book.Book;
import book.BookList;


public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书!");
        int size = bookList.getUserSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getPos(i);
            System.out.println(book);
        }
    }
}

BorrowOperation.java

  • 遍历顺序表,通过书的名字找到要借阅的图书,将其借阅情况进行更改
package operation;

import book.Book;
import book.BookList;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
        System.out.println("请输入你要借阅的书名:");
        String name = scanner.nextLine();
        int size = bookList.getUserSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                book.setBorrowed(true);
                System.out.println("借阅成功!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有你要借阅的书!");
    }
}

ReturnOperation.java

  • 遍历顺序表,通过书的名字找到要归还的图书,将其借阅情况进行更改
package operation;

import book.Book;
import book.BookList;

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
        System.out.println("请输入你要归还的书名:");
        String name = scanner.nextLine();
        int size = bookList.getUserSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
                book.setBorrowed(false);
                System.out.println("归还成功!");
                return;
            }
        }
        System.out.println("没有你要归还的图书!");
    }
}

ExitOperation.java

  • 退出系统
package operation;

import book.BookList;

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

Main.java

  • 整合所有代码,实现每个功能
import book.BookList;
import user.AdminUser;
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 name = scanner.nextLine();
        System.out.println("请输入你的身份(1.表示管理员,0.表示普通用户)");
        int choice = scanner.nextInt();
        if(choice==1){
            /*  向上转型
            User user = new AdminUser(name);
            return user;*/
            return new AdminUser(name);
        }else {
            /*   向上转型
            User user = new NormalUser(name);
            return user;*/
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        //图书的基本数据实例化
        BookList bookList = new BookList();
        //创建用户,调用登录方法
        User user = login(); //向上转型
        
        //循环
        while (true){
            int choice = user.Menu(); //动态绑定

            //根据 choice 选择合适的操作
            user.doWork(choice,bookList);
        }
    }
}

运行结果

 

举报

相关推荐

0 条评论