图书管理系统(Java语言+接口+抽象类)

目录

 图书相关设计

操作类相关设计       

用户相关设计

主函数

图书管理系统

       该系统用于管理图书,帮助用户快速借书还书的系统。设置有管理员和普通用户两种角色,管理员可以管理图书的增删改查,用户可以借书还书等操作,经过分析,首先可以抽象出分该系统涉及到三大部分:书,用户以及操作。

整个项目的框架如下:

 图书相关设计

        对于书,我们需要对书的详细情况进行描述,因此我们可以在book包下创建一个图书类Book,书的私有属性包括其名称、作者、价格、类型以及状态。但我们需对外提供相应的get和set方法,这也体现出java的封装特性,对外提供公开的接口,隐藏其内部细节。

package book;
//一本书

//类包括成员变量和成员方法
public class Book {
    //书的属性,成员变量
    private String name;//书的名称
    private String author;//书的作者
    private int  price;//书的价格
    private String type;//书的类型
    private boolean isBorrowed;//书的状态,是否被借出,默认是false

    //构造方法
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    //为私有属性提供公开的Getter and 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 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;//默认false
    }

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

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +","+
                (isBorrowed == true?" 已借出 ":" 未借出 ")+
                '}';
    }
}

        有了一本书的具体描述之后,我们需要一个书架,用于放所有的图书,我这里采用数组实现,每个下标存放的都是一个图书对象,并且提供放书和拿书的方法。以下是书架BookList类,同样将其在book包中创建。

package book;
//书架
public class BookList {

    public Book[]  bookList = new Book[10];


    private  int usedSize;//代表当前书架上有几本书
    //构造方法
    public BookList(){
        this.bookList[0]=new Book("三国演义","罗贯中",18,"小说");
        this.bookList[1]=new Book("西游记","吴承恩",48,"小说");
        this.bookList[2]=new Book("水浒传","施耐庵",28,"小说");
        this.usedSize=3;
    }
    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
    //把书放到pos位置
    public  void setBookList(int pos,Book book){
        bookList[pos]=book;
    }
    //获得pos位置的书
    public Book getBook(int pos){
        return bookList[pos];
    }
}

操作类相关设计       

      管理员的操作包含对图书的增删改查,用户的操作包含查找、借阅、归还,我们可将所有的操作都创建在operation包中,且所有操作均含有work方法,则可以生成一个统一标准,即为一个接口IOperation,可实现多态。

设置一个操作类接口,其包含work方法,实现该接口的类都可以重写该方法。

package operation;

import book.Book;
import book.BookList;

public interface IOperation {
     void  work(BookList bookList);

}

1.增加图书的操作类AddOperation

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    public  void  work(BookList bookList){
        System.out.println("新增图书!");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入新增的图书名称:");
        String name=scanner.nextLine();
        System.out.println("请输入新增的图书作者名称:");
        String author=scanner.nextLine();
        System.out.println("请输入新增的图书类型:");
        String type=scanner.nextLine();
        System.out.println("请输入新增的图书价格:");
        int  price=scanner.nextInt();
        Book book=new Book(name,author,price,type);
        int currentSize= bookList.getUsedSize();
        bookList.setBookList(currentSize,book);
        bookList.setUsedSize(currentSize+1);
        System.out.println("新增成功!");
    }

}

2.借阅图书的操作类BorrowOperation 

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class BorrowOperation implements IOperation{
    public  void  work(BookList bookList){
        System.out.println("借阅图书!");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入借阅的图书名称:");
        String name=scanner.nextLine();
        int currentSize=bookList.getUsedSize();
        for(int i=0;i<currentSize;i++){
            Book book=bookList.getBook(i);
            if(book.getName().equals(name)){
                book.setBorrowed(true);
                System.out.println("借阅成功!信息如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("书架没有这本书!无法借阅。。。");
    }

}

 3.删除图书的操作类DelOperation 

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DelOperation implements IOperation{
    public  void  work(BookList bookList){
        System.out.println("删除图书!");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入删除的图书名称:");
        String name=scanner.nextLine();
        //查找要删除的书
        int currentSize=bookList.getUsedSize();
        int index=-1;
        for(int i=0;i<currentSize;i++){
            Book book=bookList.getBook(i);
            if(book.getName().equals(name)){
              index=i;
              break;
            }
        }
        if(index==-1){
            System.out.println("没有这本书!");
            return;
        }
        //删除
        for (int i=index;i<currentSize-1;i++){
          Book book= bookList.getBook(i+1);
          bookList.setBookList(i,book);
        }
        bookList.setUsedSize(currentSize-1);
        System.out.println("删除成功!");
}

}

4.显示图书的操作类DisplayOperation 

package operation;

import book.Book;
import book.BookList;

public class DisplayOperation implements IOperation{
    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);
        }
    }

}

 5.退出系统的操作类ExitOperation 

package operation;

import book.Book;
import book.BookList;

public class ExitOperation implements IOperation{
    public  void  work(BookList bookList){
        //可以对书架手动清空一次
        System.out.println("成功退出系统!");
        System.exit(0);
    }

}

 6.查找图书的操作类FindOperation 

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    public  void  work(BookList bookList){
        System.out.println("查找图书!");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入查找的图书名称:");
        String name=scanner.nextLine();
        int size=bookList.getUsedSize();
        for(int i=0;i<size;i++){
            Book book=bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println("找到了这本书!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有这本书!");
    }

}

 7.归还图书的操作类ReturnOperation 

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation{
    public  void  work(BookList bookList){
        System.out.println("归还图书!");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入归还的图书名称:");
        String name=scanner.nextLine();
        int currentSize=bookList.getUsedSize();
        for(int i=0;i<currentSize;i++){
            Book book=bookList.getBook(i);
            if(book.getName().equals(name)){
                book.setBorrowed(false);
                System.out.println("归还成功,信息如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("书架没有这本书!无法归还。。。");
    }

}

用户相关设计

       因为我们的系统需要管理员和普通用户的参与,且其两者的操作不同,那么看到的菜单也应该是不一致的,管理员和普通用户都继承于用户类。用户类中包括名称、存放操作的数组、菜单以及调用菜单的方法。

package user;

import book.Book;
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);
    }
}

管理员类

package user;

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("**************管理员菜单*****************");
        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.退出系统*****************");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

普通用户类

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()
        };
    }
    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;
    }
}

主函数

        当我们使用该系统时,需要根据用户的输入辨别是管理员还是普通用户,以此来调用显示对应的菜单,用户才能选择对应的操作,所以先需要用户登录一下系统,登录后再根据用户的选择去作出相应操作。

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){
           return new AdminUser(name);//向上转型
        }else{
            return new NormalUser(name);//向上转型
        }
    }
    public static void main(String[] args) {
        BookList  bookList=new BookList();
        User user=login();
        //User user=new AdminUser(name);管理员菜单
        //User user=new NormalUser(name);普通用户菜单
        while(true) {
            int choice = user.menu();//拿到用户的选择
            //System.out.println(choice);
            user.doOperation(choice, bookList);
        }
    }
}

以此整个项目就书写完成,运行如此:

欢迎家人们补充~,喜欢就点个关注支持一下吧,谢谢大家!ღ( ´・ᴗ・` )比心

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值