【初学者的图书系统小练习】

本文介绍了如何利用Java基础知识和面向对象思想构建一个简单的图书管理系统。系统包括管理员和普通用户两种角色,具备增删查改图书及借阅、归还等功能。通过合理的包结构和类设计,实现了代码的模块化。用户登录后可选择身份,根据身份权限执行相应的操作。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

        大家好呀

        最近快期末了,大家有没有泡图书馆呀,今天的学习内容跟图书馆有关,没错,就是图书管理系统,但是目前所学知识水平有限,这是一个很简单的图书系统小练习。不要急,我们的目的是在于如何使用已知学过的知识进行实践。

 


前言

这里将带大家用基本的Java语法和面向对象的思想来实现这个小程序。


提示:以下是本篇文章正文内容,下面案例可供参考

一、需求分析

图书馆书籍系统的用户分为管理员和普通用户两种,两种用户之间所能实现的功能是不同的。例如我理解想要实现的业务是这样子的:

管理员:

 

 普通用户:

 业务实现内容不是重点,大家可以根据自己的喜好去进一步完善~

二、具体实现过程

1.代码目录

  建立一个叫booktest的项目,在src下新建book、operation、user 三个包,分别将跟书有关的类、跟操作有关的类、跟用户有关的类存储起来。即很好地应用了包的作用。

包的作用:

1.提供了类似于操作系统树状文件夹的组织形式,能分门别类地存储、管理类,易于查找并使用类;

2.解决了类命名时相同的冲突。在Java中,不能在一个同一个包中定义两个类名相同的类,但在不同包中可以;

3.保护类中成员变量和方法。该成员变量和方法的使用范围取决于访问修饰符。
 

代码如下(示例):

package book;
 
public class Book {
    private String name;//书名
    private String author;//作者
    private double price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出
 
    //Getter  Setter方法
    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;
    }
 
    public boolean isBorrowed() {
        return isBorrowed;
    }
 
    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
    //提供一个4个参数的构造方法
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
 
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", "+((isBorrowed==true)?"已借出":"未借出") +
                '}';
    }
}

2.operation包

代码如下(示例):

  1. package operation;

  2. import book.BookList;

  3. public interface IOperation {

  4. void work(BookList bookList);//抽象方法

实现新增图书:


package operation;
 
import book.Book;
import book.BookList;
 
import java.util.Scanner;
 
public class AddOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书!");
 
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图书的名字:");
        String name = sc.nextLine();
 
        System.out.println("请输入图书的作者:");
        String author = sc.nextLine();
 
        System.out.println("请输入图书的价格:");
        double price = sc.nextDouble();
        sc.nextLine();//使用nextLine()接收上面键盘输入的'\n'
 
        System.out.println("请输入图书的类型:");
        String type = sc.nextLine();
 
        Book book = new Book(name,author,price,type);
        int currentSize = bookList.getUsedSize();
        bookList.setBooks(currentSize,book);
 
        bookList.setUsedSize(currentSize+1);
 
        System.out.println("《"+name+"》"+"已新增!");
    }
}

BorrowOperation类

实现借阅图书:


package operation;
 
import book.Book;
import book.BookList;
 
import java.util.Scanner;
 
public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
 
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你想要借阅书的名字:");
        String name = sc.nextLine();
 
        int currentSize = bookList.getUsedSize();
 
        int i=0;
        for(i=0;i<currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                book.setBorrowed(true);
                System.out.println("《"+name+"》借阅成功,祝畅游阅读世界!");
                return;
            }
        }
        if(i>=currentSize){
            System.out.println("抱歉,本书架中没有此书,我们会尽快联系图书管理员新增此书!");
        }
    }

}

DelOperation类

实现删除图书:


package operation;
 
import book.Book;
import book.BookList;
 
import java.util.Scanner;
 
public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!");
 
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你想要删除书的名字:");
        String name = sc.nextLine();
 
        int i=0;
        int index = 0;
        int currentSize = bookList.getUsedSize();
        for (i=0;i<currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                index = i;
                break;
            }
        }
        if(i>=currentSize){
            System.out.println("没有你想要删除的这本书");
            return;
        }
 
        for(i=index;i<currentSize-1;i++){
            Book book = bookList.getBook(i+1);
            bookList.setBooks(i,book);
        }
 
        bookList.setBooks(currentSize,null);
        bookList.setUsedSize(currentSize-1);
        System.out.println("《"+name+"》"+"已删除");
    }
}

DisplayOperation类

实现显示图书:


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

}

ExitOperation类

实现退出系统:


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

}

FindOperation类

实现查找图书:


package operation;
 
import book.Book;
import book.BookList;
 
import java.util.Scanner;
 
public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
 
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入书名:");
        String name = sc.nextLine();
 
        int currentSize = bookList.getUsedSize();
 
        int i=0;
        for(i=0;i<currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println("找到这本书了!");
                System.out.println(book);
                return;//找到这本书,查找程序提前结束
            }
        }
        if(i>=currentSize) {
            //说明没有找到
            System.out.println("没有你要找的这本书!");
        }
    }

}

ReturnOperation类

实现归还图书:


package operation;
 
import book.Book;
import book.BookList;
 
import java.util.Scanner;
 
public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
 
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你想要归还书的名字:");
        String name = sc.nextLine();
 
        int currentSize = bookList.getUsedSize();
 
        int i=0;
        for(i=0;i<currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                book.setBorrowed(false);
                System.out.println("《"+name+"》"+"归还成功,祝每天都有好心情");
                return;
            }
        }
    }

}

user包

前文提到,用户类型分为管理员和普通用户两种,这两种类型都有相同的name属性,都要有一个功能菜单,功能菜单中有相同的操作方法也有各自才有的特殊操作方法,既然重合度这么高,但又有区别,好喔,这里需要用一个父类更加方便。

User类就是user这个包中的父类,AdminUser和NormalUser是子类。

继承的作用:

通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量

允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类

1.user类

package user;
 
import book.BookList;
import operation.IOperation;
 
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){
        this.iOperations[choice].work(bookList);
    }
}

2.AdminUser类


package user;
 
import book.BookList;
import operation.*;
 
import java.util.Scanner;
 
public class AdminUser extends User{
 
    public AdminUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation()
        };
    }
    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();
        return choice;
}
}

3.NormaIUser类


package user;
 
import operation.*;
 
import java.util.Scanner;
 
public class NormalUser extends User{
 
    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
                new DisplayOperation()
        };
 
    }
    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();
        return choice;
    }

}

Main类

Main类用于将这些功能属性整合起来,也是整个小项目的执行入口,

用户登录之后,可选择自己的身份——(管理员/普通用户)

菜单用循环实现多次打印

login()函数将AdminUser或者NormalUser向上转型为父类User

在main()方法中,用一个父类user调用menu()方法,根据user是管理员还是普通用户,向下转型调用各自不同的菜单
 


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 sc = new Scanner(System.in);
        String name = sc.nextLine();
        System.out.println("请选择用户身份:1.管理员 2.普通用户");
 
        int choice = sc.nextInt();
        if(choice==1){
           return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }
 
    }
    public static void main(String[] args) {
        //开始整合
        BookList bookList = new BookList();//图书准备
        //登录
        User user = login();
        int temp = 0;
        do{
        int choice = user.menu();//动态绑定
        user.doOperation(choice,bookList);
        temp = choice;
        }while (temp!=0);
    }

}

三、效果展示

psss:因操作过长,长截图无法截全,为了保证展示完整性,特意用几张小图截的,如果给您带来阅读不适,请见谅~

示例一

 

 

 示例二

 

 

 

 


总结

学习一个知识可能很简单,但将学到的知识进行整合应用绝对比学那个知识要难,但如果相信自己可以做到,那绝对可以学下去,保持良好的心态是提高学习效率的利器。

咱们一起加油💪💪💪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值