Java-图书登录系统的实现


实现效果
它将面对 管理员 和 普通用户 两种用户来提供服务,并且各自的服务并不相同。


实现思路
一般写项目,每个独立的功能都会写成一个类,而有关联的功能,都会将多个类存放在一个包中,此项目我们将用 3 个包来体现我们的效果

book包
Book类 —> 用来定义一本书
既然是图书系统,那么必然不可能仅仅只有一本书,我们还需要一个书架,来存储书籍 BookList 类
在这里插入图片描述

user包
因为我们有两种用户可以使用这个图书系统,而且每种用户都有自己的特性,所以也需要定义成类
有 User类(后面两个类的共同特征抽取出来的,User类可以是一个抽象类),adminUser类,normalUser类
在这里插入图片描述

opertion包
这个包底下就是我们的基本操作
查询图书,借阅图书,归还图书,退出系统,新增图书,删除图书,显示所有图书
这里我们增加一个操作接口,让所有功能来实现这个接口,从而完善各自的内容。
Java-图书登录系统的实现_第1张图片

Main类
上面的类就已经实现了我们需要的功能了,Main类就是来整合这些操作功能的,在Main类中,我们需要根据登陆的账户类型不同,来显示不同的菜单供其使用图书系统.


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


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

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 String getAuthor() {
        return author;
    }

    public String getDescribe() {
        return describe;
    }

    public double getPrice() {
        return price;
    }

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

    public void setAuthor(String author) {
        this.author = author;
    }

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

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

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

    public boolean isBorrowed() {
        return isBorrowed;
    }

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

BookList类中设置了书的数组,用来存放书。
当前书的数量。
一些方法
获得书架上某个位置的书【getBooks】
修改架上某个位置的书【setBooks】
获取当前存储了书的数量【getUsedSized】
修改当前存储的书的数量【setUsedSized】

public class BookList {
    Book[] books=new Book[5];//这里最多可以放置5本书
    private int usedSized=3;//已存数的数量

    public BookList() {
        books[0]=new Book("红楼梦","曹","小说",11);
        books[0]=new Book("红楼","网","说",1111);
        books[0]=new Book("红","照","小",111111);
    }

    public void setBooks(int pos,Book book) {//设置某个位置的书,用于查找和删除图书
        this.books[pos]=book;
    }

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

    public Book getBooks(int pos) {//获取某个位置的书,返回值为对象
        return this.books[pos];
    }

    public int getUsedSized() {
        return usedSized;
    }
}

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

User类
每个用户都有自己的姓名;
每个用户都可以操作一些功能;
管理员和普通用户的菜单是不一样的,需要在不同类型的用户下重写,我们这里只提供抽象方法
由于普通用户和管理员权限不同,一些操作的结果会不同,这里我们提供动态绑定
Java-图书登录系统的实现_第2张图片
在这里插入图片描述

public abstract  class User {
    protected String name;
    protected IOperation[] ioperations;//创建一个数组,这个数组里面存放可以进行操作的功能

    public User(String name) {
        this.name = name;
    }
    public abstract int menu();管理员和普通用户的菜单肯定是不一样的,所以让他们自己去重写方法。

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

AdminUser类
这里我们需要继承user类,
自己创建构造函数,要用到user类中的name成员变量,并初始化一个数组,这个数组中的成员为当前用户权限下可以进行的操作,成员类型为对象。
重写menu函数;
Java-图书登录系统的实现_第3张图片

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

    @Override
    public int menu() {
        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 sc=new Scanner(System.in);
        int choice=sc.nextInt();//choice用于选择操作类型
        return choice;
    }
}

NomalUser类
与上述 的AdminiUser类几乎是一样的道理

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("hello"+this.name+"欢迎来到图书系统");
        System.out.println("1 查找图书");
        System.out.println("2 借阅图书");
        System.out.println("3 归还图书");
        System.out.println("0 退出系统");

        System.out.println("请输入你的操作");
        Scanner sc=new Scanner(System.in);
        int choice=sc.nextInt();//choice用于选择操作类型
        return choice;
    }
}

main类
这里我们通过一个login方法提示用户输入姓名和身份类型,利用login方法的返回值返回身份类型,这里发生向上转型
Java-图书登录系统的实现_第4张图片
Java-图书登录系统的实现_第5张图片

public class Main {
    public static User login(){
        System.out.println("请输入你的姓名");
        Scanner sc=new Scanner(System.in);
        String name= sc.nextLine();
        System.out.println("请输入你的身份:1 管理员   0 普通用户");
        int choice=sc.nextInt();
        if(choice==1){
            return new AdminUser(name);//向上转型
        }else{
            return new NormalUser(name);//向上转型
        }
    }
    public static void main(String[] args) {
        User user=login();//返回值方式向上转型,确定操作者的身份类型
        BookList bookList=new BookList();//new一个书库的对象

        while(true){//可以循环输入
            int choice=user.menu();//操作者可以输入要进行怎么样的操作
            user.doOperation(choice,bookList);//对书库进行功能操作
        }
    }
}

opertion包
IOperation接口
这里我们只提供一个抽象方法,用于对Booklist类的对象进行功能上的操作
Java-图书登录系统的实现_第6张图片






至此,我们的框架已经搭建完毕,可以进行简单的试跑
Java-图书登录系统的实现_第7张图片





下面我们补全对应的功能操作
AddOperation类
Java-图书登录系统的实现_第8张图片

public class AddOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入书的名字");
        String name=sc.nextLine();
        System.out.println("请输入书的作者");
        String author=sc.nextLine();
        System.out.println("请输入书的类型");
        String describe=sc.nextLine();
        System.out.println("请输入书的价格");
        double price=sc.nextDouble();

        Book book =new Book(name,author,describe,price);//new一个新的book对象,并完成初始化
        int pos=bookList.getUsedSized();//获取booklist中的书总数,为增加新书获取位置
        bookList.setBooks(pos,book);//将新书放置在数组库中的最后一个位置
        bookList.setUsedSized(pos+1);//书的总数+1
        System.out.println("添加书籍成功");
    }
}

运行结果如下
Java-图书登录系统的实现_第9张图片


FindOperation类
Java-图书登录系统的实现_第10张图片

ublic class FindOperation implements IOperation{
    public void work(BookList bookList) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要查找图书的名字");
        String name=sc.nextLine();

        //遍历书架,去查找有无此书
        int currentSize=bookList.getUsedSized();
        for (int i = 0; i <currentSize; i++)
            if (name.equals(bookList.getBooks(i).getName())) {
                System.out.println("查到了,该书的信息如下");
                System.out.println(bookList.getBooks(i));
                return;
            }
        System.out.println("找不到该书");
    }
}

BorrowOperation类

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要借阅图书的名字");
        String name=sc.nextLine();
        
        //遍历书架,去查找有无此书
        int currentSize=bookList.getUsedSized();
        for (int i = 0; i <currentSize; i++) {
            if(name.equals(bookList.getBooks(i).getName())){
                //如果有,看它是否有被借出
                if(bookList.getBooks(i).isBorrowed()==false){
                    System.out.println("借阅成功");
                    bookList.getBooks(i).setBorrowed(true);
                    return;
                }else{
                    System.out.println("该书已被借出");
                    return;
                }
            }
        }
        System.out.println("没有此书");
    }
}

运行结果如下
Java-图书登录系统的实现_第11张图片


DelOperation类
Java-图书登录系统的实现_第12张图片

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要删除的书籍");
        String name=sc.nextLine();
        int index=-1;
        for (int i = 0; i < bookList.getUsedSized(); i++) {
            if(bookList.getBooks(i).getName().equals(name)){//查找有无该书
                index=i;
                break;
            }
        }
        if(index==-1){
            System.out.println("没有你要删除的图书");
            return;
        }
        //找到了,准备开始向前覆盖
        for (int i = index; i < bookList.getUsedSized()-1; i++) {
            Book book=bookList.getBooks(i+1);
            bookList.setBooks(i,book);
        }
        //覆盖之后,最后一个数组位置赋null,并设置书的数量-1
        bookList.setBooks((bookList.getUsedSized())-1,null);
        bookList.setUsedSized(bookList.getUsedSized()-1);
        System.out.println("删除成功");
    }
}

Java-图书登录系统的实现_第13张图片


ExitOperation类

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

Java-图书登录系统的实现_第14张图片


ReturnOperation类
逻辑同借阅类的逻辑相似

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入要归还图书的名字");
            String name=sc.nextLine();

            //遍历书架,去查找有无此书
            int currentSize=bookList.getUsedSized();
            for (int i = 0; i <currentSize; 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("没有此书");
        }
    }

Java-图书登录系统的实现_第15张图片


ShowOperation类
直接遍历即可

public class ShowOperation implements  IOperation{
    @Override
    public void work(BookList bookList) {
        for (int i = 0; i < bookList.getUsedSized(); i++) {
            System.out.println(bookList.getBooks(i));
        }
    }
}

Java-图书登录系统的实现_第16张图片


你可能感兴趣的:(Java,java,开发语言)