Java图书管理系统简化版期末考核作业

1.设计思路

  1. 包分类:书籍book,操作operation[包含管理员和普通用户的操作集合],用户类User,主函数入口TestMain.java
  2. 分析:

书籍book包

Book类 创建的Book类中包含了书籍的名字,作者,价格,类型和借阅状态。构造方法会重写,设置初始化的时候书籍初始化信息
BookList类 成员变量中usedSize确定图书存储量;引用Book.java的Book类,创建一个Book类型的数组,用于存储书籍

操作operation

Add类 导入Book和BookList类,Scanner输入确定好书记基础信息后利用Book类new一个新的并且自带的Scanner属性的book对象,通过bookList.getUsedSize来获取已经存储的书籍数量后再利用bookList.setBooke进行“尾插”存放图书,并且插入成功后要设置setUsedSize的存储+1
Borrow类 通过Scaner获取要借阅书籍的属性,再利用for循环遍历,如果找到书籍。就把借阅状态isBorrowed改为true,表示被借阅
Del类 Scaner获取书籍属性,for循环找到对应属性后退出,if判断退出for循环后的i值是否和已存书籍数量相等,如果相等,表示遍历所有书籍依旧没有找到对应属性而不是break退出循环;找到对应属性后就需要像顺序表一样删除,后边的往前覆盖。
Display类 for循环,利用Book book = bookList.getBook(i)来获取所有书籍,然后输出book值即可输出一个book对象的所有信息
Exit类 利用System.exit(退出码:-1,1,0)即可退出程序
Find类 Scanner获取书籍属性,for循环匹配书籍名称是否相等即可。如果没有找到就在循环之外输出提示
Return类 Scanner获取书籍属性,for循环将匹配到的书的isBorrowed的true状态改为false状态;跳出循环后依旧没有找到就输出提示
IOperation接口 设计一个基础的work抽象方法,供给其operation包中所有类的使用

用户user包

User类 所有用户的基础类,拥有用户名,操作的集合,构造方法,不同类用户的打印窗口和对应的执行操作调用
Admin 管理员。继承User类, 初始化操作集合,打印的用户界面
NormalUser 普通用户。除了用户界面不一样之外,其余都一样
主函数入口TestMain 将BookList,Admin,User,NormalUser全部导入Scanner获取用户输入,区分用户是管理员还是普通用户并返回对应的操作权限界面;BookList booList初始换存储的书籍通过login的返回值确定登录的用户是不是管理员menu的返回值来执行对应权限操作
1.Book类
package day15Clonable及图书代码练习.book;

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

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

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

    public String getName() {
    
    
        return name;
    }

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

    public int getPrice() {
    
    
        return price;
    }

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

    public String getType() {
    
    
        return type;
    }

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

    public boolean isBorrowed() {
    
    
        return isBorrowed;
    }

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

2.BookList类
package day15Clonable及图书代码练习.book;

public class BookList {
    
    
    private Book[] books = new Book[100];
    private int usedSize = 0;

    public BookList() {
    
    
        books[0] = new Book("穷查理宝典", "彼得.考夫曼", 168, "理财");
        books[1] = new Book("塑造世界经济的五十项伟大发明", "蒂姆.哈福德", 58, "兴趣");
        books[2] = new Book("影响力", "罗伯特", 45, "心理学");
        this.usedSize = 3;
    }
    public void setBooks(int pos, Book book) {
    
    
        this.books[pos] = book;
    }

    public Book getBook(int pos) {
    
    
        return this.books[pos];
    }

    public int getUsedSize() {
    
    
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
    
    
        this.usedSize = usedSize;
    }
}

3.操作集合
  1. Add类
package day15Clonable及图书代码练习.operation;

import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.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.print("清输入图书的名字: ");
        String name = scanner.nextLine();
        System.out.print("请输入图书的作者: ");
        String author = scanner.nextLine();
        System.out.print("请输入图书的价格: ");
        int price = scanner.nextInt();
        System.out.print("请输入图书的类型: ");
        String type = scanner.next();
        Book book = new Book(name, author, price, type);
        int curSize = bookList.getUsedSize();
        bookList.setBooks(curSize, book);
        bookList.setUsedSize(curSize+1);
        System.out.println("新增成功");
    }
}

  1. Borrow类
package day15Clonable及图书代码练习.operation;

import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.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.print("清输入图书的名字: ");
        String name = scanner.nextLine();

        for (int i = 0; i < bookList.getUsedSize(); i++) {
    
    
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
    
    
                // 可借阅
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("没有你要借阅的书");
    }
}

  1. Del类
package day15Clonable及图书代码练习.operation;

import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.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.print("清输入删除图书的名字: ");
        String name = scanner.nextLine();

        int i = 0;
        for (; i < bookList.getUsedSize(); i++) {
    
    
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
    
    
                break;
            }
        }
        if (i == bookList.getUsedSize()) {
    
    
            System.out.println("没有这本书");
            return;
        }
        // 删除,顺序表一样:要想着删除最后的结尾,我们不能用cur.next来循环判断而是用cur来判断。这样才不会再倒数二哥结点停下
        for (int pos = i; pos < bookList.getUsedSize()-1;++pos) {
    
    
//            bookList[pos] = bookList[pos+1]: error

            /*Book book = bookList.getBook(pos+1);
            bookList.setBooks(pos, book);代码较多,下边的代码更精简*/

            bookList.setBooks(pos, bookList.getBook(pos+1));
        }
        bookList.setUsedSize(bookList.getUsedSize()-1);
    }
}

  1. Display类
package day15Clonable及图书代码练习.operation;

import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.book.BookList;

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

  1. Exit类
package day15Clonable及图书代码练习.operation;

import day15Clonable及图书代码练习.book.BookList;

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

  1. Return类
package day15Clonable及图书代码练习.operation;

import day15Clonable及图书代码练习.book.Book;
import day15Clonable及图书代码练习.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.print("清输入归还图书的名字: ");
        String name = scanner.nextLine();

        for (int i = 0; i < bookList.getUsedSize(); i++) {
    
    
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
    
    
                book.setBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("没有你要归还的图书");
    }
}

  1. IOperation接口
package day15Clonable及图书代码练习.operation;

import day15Clonable及图书代码练习.book.BookList;

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

4.用户
  1. User类
package day15Clonable及图书代码练习.user;

import day15Clonable及图书代码练习.book.BookList;
import day15Clonable及图书代码练习.operation.IOperation;

public abstract class User {
    
    
    public String name;
    protected IOperation[] operations;

    public User(String name) {
    
    
        this.name = name;
    }
    public abstract int menu();
    public void doOperation(BookList bookList, int choice) {
    
    
        this.operations[choice].work(bookList);
    }
}

  1. Admin类
package day15Clonable及图书代码练习.user;

import day15Clonable及图书代码练习.operation.*;

import java.util.Scanner;

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

    @Override
    public int menu() {
    
    
        System.out.println("♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣");
        System.out.println("hello " + 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;
    }
}

  1. Normal类
package day15Clonable及图书代码练习.user;

import day15Clonable及图书代码练习.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(),
        };
    }

    @Override
    public int menu() {
    
    
        System.out.println("==========================================");
        System.out.println("hello " + 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;
    }
}

5.主函数入口TestMain类
package day15Clonable及图书代码练习;

import day15Clonable及图书代码练习.book.BookList;
import day15Clonable及图书代码练习.user.Admin;
import day15Clonable及图书代码练习.user.NormalUser;
import day15Clonable及图书代码练习.user.User;

import java.util.Scanner;

public class TestMain {
    
    
    public static User login() {
    
    
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入姓名: ");
        String name = scanner.nextLine();
        System.out.print("请输入你的身份[1-->管理员 2-->普通用户]: ");
        int choice = scanner.nextInt();
        if (choice == 1) {
    
    
            return new Admin(name);
        } else {
    
    
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {
    
    
        //1.准备书籍
        BookList bookList = new BookList();
        //2.登录
        User user = login();
        while (true) {
    
    
            //选择是几,就可以对应到哪个方法
            user.doOperation(bookList, user.menu());
        }
    }
}

6.Admin效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.NormalUser效果图

在这里插入图片描述
在这里插入图片描述
注意查看用户的介于状态isBorrowed的true和false变化

2.结尾小彩蛋:Cloneable

提起克隆,深浅拷贝会被多次提起。如果修改克隆副本会影响数据源就是浅拷贝反知则是深拷贝;对于数组中是简单类型元素是深拷贝,引用类型是浅拷贝

int[] array1 = {
    
    1, 2, 3, 4, 5, 6};
int[] array2 = array1.clone();
array2[0] = 99;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));

输出结果:
[1, 2, 3, 4, 5, 6]
[99, 2, 3, 4, 5, 6]
因为数组中是简单的int类型,因此是深拷贝并不因为数组是引用类型就是浅拷贝
import java.util.Arrays;
/**
 * class Person类属于自定义类,没有继承Object,所以没有clone()方法
 * <p>
 * 1.Ctrl+左键点击 Cloneable-->空接口: 也叫标记接口,只要一个类实现了这个接口,那么就标记这个类是可以进行clone的
 * 2.重写clone方法[Wind: Alt+Ins/MacOS: option+Enter 后-->选择clone()]
 * 3.解决person.cloe()依旧报错问题: 鼠标颠倒person.clone()然后Alt+Enter选怎Add Exceptionxxx添加异常到方法区
 * 4.我们发现clone()方法返回值是Object,所以我们需要强制类型转
 */
class Money implements Cloneable {
    
    
    double money = 12.5;
    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
        return super.clone();
    }
}

class Person implements Cloneable {
    
    
    public int age;
    Money m = new Money();

    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
//        return super.clone();
        //1.克隆person
        Person p1 = (Person) super.clone();
        //2.克隆当前的Money对象
        p1.m = (Money) this.m.clone();
        return p1;
    }
}

Person person1 = new Person();
Person person2 = (Person) person1.clone();
person2.m.money = 99.9;
System.out.println(person1.m.money);
System.out.println(person2.m.money);
输出结果:
12.5
99.9
说明我们的引用类型已经成功深拷贝

猜你喜欢

转载自blog.csdn.net/weixin_45364220/article/details/113096991