【项目】简单的图书管理系统(下)

本文介绍了一个简单的图书管理系统的设计与实现,包括书、书架、管理员及普通用户的类定义,以及各类操作如添加、删除、借阅等功能的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

▮ 交互对象

▪Book

▪Bookcase

▪User

▪AdminiUser

▪ NomalUser

▮接口与实现

▪接口

▪ ExitOperation

▪AddOperation 

▪BorrowOperation

▪DisOperation 

▪ReturnOperation

▪FindOperation

▪DelOperation 

▮Main

代码讲解:http://t.csdn.cn/k2qVO

▮ 交互对象

▪Book

public class Book {
   private String name; //书名
   private String author; //作者
   private int price; //价格
   private String type; //种类
   private boolean isBorrowing; //借阅状态

    //构造方法
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
    //默认初始化,构造方法
    public Book() {
        this.name = "书架为空";
        this.author = "书架为空";
        this.price = 0;
        this.type = "书架为空";
    }
    //toString输出成员属性
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", Borrow='"+ (isBorrowing ?"已被借阅" :"未被借阅") + '\'' + //这个地方是自行添加的,编译器不会自动生成
                '}';
    }

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

    public void setBorrowing(boolean borrowing) {
        isBorrowing = borrowing;
    }
}

▪Bookcase

public class Bookcase {
    private static final int BOOKCASE_SIZE = 10; //书架容量,用final修饰,不可修改
    private Book[] booklist = new Book[BOOKCASE_SIZE]; //书单
    private int usednumber; //使用书架的书本数量,即书架上有几本书

    //默认构造方法
    public Bookcase() {
        //书架上的的默认放置的书本
        booklist[0] = new Book("三国演义", "罗贯中", 19, "小说");
        booklist[1] = new Book("西游记", "吴承恩", 28, "小说");
        booklist[2] = new Book("红楼梦", "曹雪芹", 39, "小说");
        this.usednumber = 3;
    }

    //功能:根据下标来找到图书
    public Book getBooks(int pos) { //参数:下标
        return booklist[pos]; //返回:下标对应的Book
    }
    //功能:更换下标处的书籍
    public void setBooks(int pos, Book book) { //参数:下标,新的BOOK
        booklist[pos] = book;
    }
    //功能:得到书架上书本的个数
    public int getUsednumber() {
        return usednumber;
    }

    //功能:修改书架上书本的个数
    public void setUsednumber(int usednumber) {
        this.usednumber = usednumber;
    }
}

▪User

public class User  {
     private String name; //用户名
     public Ioperation[] operation; //这是一个接口数组,装的是用户能进行的行为行为
    //构造方法,非默认
     public User(String name){
        this.name = name;
    }
    //功能:打印菜单并且接收用户的选择,需要子类去重写
    public int nume (){
        return 0;
     }
     //输出用户名
     public String gteName(){
         return this.name;
     }
}

▪AdminiUser

public class AdminiUser extends User{
    public int nume(){
        System.out.println('\n');
        Scanner sc = new Scanner(System.in);
        System.out.println("管理员:"+super.gteName()+",欢迎进入图书管理系统");
        System.out.println("0.退出系统");
        System.out.println("1.添加书籍");
        System.out.println("2.删减书籍");
        System.out.println("3.展示书籍");
        System.out.println("请选择你的操作:");
        return sc.nextInt();
    }
    //构造方法,非默认
    public AdminiUser(String name){
        super(name);
        operation = new Ioperation[]{
                new ExitOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisOperation(),
        };
    }
}

▪ NomalUser

public class NomalUser extends User{
    public int nume(){
        System.out.println('\n');
        Scanner sc = new Scanner(System.in);
        System.out.println("普通人员:"+super.gteName()+",欢迎进入图书管理系统");
        System.out.println("0.退出系统");
        System.out.println("1.借阅书籍");
        System.out.println("2.归还书籍");
        System.out.println("3.查找书籍");
        System.out.println("请选择你的操作:");
        return sc.nextInt();
    }
    public NomalUser(String name){
        super(name);
        super.operation = new Ioperation[]{
           new ExitOperation(),
           new BorrowOperation(),
           new ReturnOperation(),
           new FindOperation(),
        };
    }
}

▮接口与实现

▪接口

public interface Ioperation {
    //功能:这是一个抽象方法,它的功能由七大类来重写实现
    void work(Bookcase bookcase); // 参数:Bookcase的一个实例对象,无返回
}

▪ ExitOperation

public class ExitOperation implements Ioperation{ //这个类实现了接口
    @Override //重写的标志
    public void work(Bookcase bookcase) {
        System.out.println("退出系统");
        System.exit(0); //调用了System类中的exit方法,传入0表示程序正常结束
    }
}

▪AddOperation 

public class AddOperation implements Ioperation{ //这个类实现了接口
    @Override
    public void work(Bookcase bookcase){ //传入一个Bookcase的对象
        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("请输入书籍类型");
        String type = sc.nextLine();
        System.out.println("请输入书籍价格");
        int price = sc.nextInt(); //这里是整形,上面的都是字符串
 
        //调用对象bookcase的方法得到书架上书籍的数量
        int usednumber = bookcase.getUsednumber(); 
        //调用对象bookcase的setBooks方法,new了一个新的书籍放进书架
        bookcase.setBooks(usednumber,new Book(name,author,price,type)); //因为数组下标是从0开始的,所以usednumber作为索引时,正好指向一个空位
        //添加了一本书籍后,书架上书籍的数量加1
        bookcase.setUsednumber(usednumber+1);
        System.out.println("添加成功");
    }
}

▪BorrowOperation

public class BorrowOperation implements Ioperation{ //这个类实现了接口
    @Override
    public void work(Bookcase bookcase) { //传入了一个类型为Bookcase的对象
        System.out.println("-----借阅书籍-----");
        //输入借阅书籍的名称
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入借阅书籍名称");
        String name = sc.nextLine();
        //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件
        int usednumber = bookcase.getUsednumber();
 
        //遍历书架里所有的书籍
        for(int i=0; i<usednumber; i++){
            //在书架中寻找与借阅书籍名称相同的书籍
            if(name.equals(bookcase.getBooks(i).getName())){ 
                    //name.equals(str): 调用了字符串name的实例方法,来比较name是否与str同名
                    //bookcase.getBooks(i): 找到下标i对应的Book对象
                    //.getName(): 得到此Book对象的"书名"属性,这是一个字符串属性,即str
                System.out.println("借阅成功");
                //把这本书的属性改为“已借阅”
                Book book = bookcase.getBooks(i);
                book.setBorrowing(true);
                System.out.println(book);
                //若找到此书,则直接结束这个方法,不执行下方"未查到此书"的打印
                return;
            }
        }
        System.out.println("未查到此书");
    }
}

▪DisOperation 

public class DisOperation implements Ioperation{ //这个类实现了接口
    @Override public void work(Bookcase bookcase) {
        System.out.println("-----展示书籍-----");
        //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件
        int usednumber = bookcase.getUsednumber();
        for(int i=0; i<usednumber; i++){
            //使用println(对象)来打印对象的所有属性,
            System.out.println(bookcase.getBooks(i));
                //bookcase.getBooks(i): 找到下标i对应的Book对象
                //println(对象)等同于调用对象的toString()方法,所以对象内部要重写toString
        }
        //书架书籍为空的情况
        if(usednumber == 0){
            System.out.println("图书馆书籍为空");
            return;
        }
    }
}

▪ReturnOperation

public class ReturnOperation implements Ioperation{ //这个类实现了接口
    @Override
    public void work(Bookcase bookcase) {
        System.out.println("-----归还书籍-----");
        //输入归还书籍的名称
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入归还书籍名称");
        String name = sc.nextLine();
        
        //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件
        int usednumber = bookcase.getUsednumber();
        for(int i=0; i<usednumber; i++){
            //在书架中寻找与借阅书籍名称相同的书籍
            if(name.equals(bookcase.getBooks(i).getName())){ 
                    //name.equals(str): 调用了字符串name的实例方法,来比较name是否与str同名
                    //bookcase.getBooks(i): 找到下标i对应的Book对象
                    //.getName(): 得到此Book对象的"书名"属性,这是一个字符串属性,即str
                System.out.println("归还成功");
                //把这本书的属性改为“未借阅”
                Book book = bookcase.getBooks(i);
                book.setBorrowing(false);
                System.out.println(book);
                //若找到此书,则直接结束这个方法,不执行下方"图书馆未收藏此书"的打印
                return;
            }
        }
        System.out.println("图书馆未收藏此书");
    }
}

▪FindOperation

public class FindOperation implements Ioperation{ //这个类实现了接口
    @Override
    public void work(Bookcase bookcase) {
        System.out.println("-----查找书籍-----");
        //输入查找书籍的名称
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入查找书籍名称");
        String name = sc.nextLine();
        //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件
        int usednumber = bookcase.getUsednumber();
 
        if(usednumber == 0){
            System.out.println("图书馆书籍为空");
            return;
        }
 
        for(int i=0; i<usednumber; i++){
            //在书架中寻找与借阅书籍名称相同的书籍
            if(name.equals(bookcase.getBooks(i).getName())){ 
                    //name.equals(str): 调用了字符串name的实例方法,来比较name是否与str同名
                    //bookcase.getBooks(i): 找到下标i对应的Book对象
                    //.getName(): 得到此Book对象的"书名"属性,这是一个字符串属性,即str
                System.out.println("查找成功");
               //使用println(对象)来打印对象的所有属性,
                System.out.println(bookcase.getBooks(i));
                    //bookcase.getBooks(i): 找到下标i对应的Book对象
                    //println(对象)等同于调用对象的toString()方法,所以对象内部要重写toString
                //若找到此书,则直接结束这个方法,不执行下方"未查到此书"的打印
                return;
            }
        }
        System.out.println("未查到此书");
    }
}

▪DelOperation 

public class DelOperation implements Ioperation{ //这个类实现了接口
    public void work(Bookcase bookcase){
        System.out.println("-----删除书籍-----");
        //输入删除书籍的名称
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入删除书籍名称");
        String name = sc.nextLine();
        //调用对象bookcase的方法得到书架上书籍的数量,作为遍历结束的条件
        int usednumber = bookcase.getUsednumber();
 
        if(usednumber == 0){
            System.out.println("图书馆书籍为空");
            return;
        }
 
        for(int i=0; i<usednumber; i++){
           //在书架中寻找与借阅书籍名称相同的书籍
            if(name.equals(bookcase.getBooks(i).getName())){ 
                    //name.equals(str): 调用了字符串name的实例方法,来比较name是否与str同名
                    //bookcase.getBooks(i): 找到下标i对应的Book对象
                    //.getName(): 得到此Book对象的"书名"属性,这是一个字符串属性,即str
                System.out.println("删除成功");
                for(;i<usednumber;i++){
                    //用下标i+1的书籍来覆盖下标为i的书籍,既实现了对书籍的删除,又补上了删除后的空缺部分
                    bookcase.setBooks(i,bookcase.getBooks(i+1));
                }
                //因为i后面的书籍都被前移,最后的一本书籍会多余一本,要被清空
                bookcase.setBooks(usednumber,null);
                //书籍数量-1
                bookcase.setUsednumber(usednumber -= 1);
            }
        }
    }
}

▮Main

public class Main {
    //功能:根据选项的不同,返回子类管理员或普通人
    public static User chose (){
        //输入User的name属性
        System.out.println("请输入你的名字");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        
        //选择身份
        System.out.println("请输入你的身份:1.管理员 2.普通人员");
        int i = sc.nextInt();
        //返回子类:管理员
        if(i == 1){
            return new AdminiUser(name); //new了一个对象
        //返回子类:普通人    
        }else if(i == 2){
            return new NomalUser(name);
        }
        return null;
    }
    
    //mian()函数
    public static void main(String[] args) { 
        //创建一个书架对象
        Bookcase Bookcase = new Bookcase();
        //创建一个父类User来接收子类,实现向上转型
        User user = chose();
        int chose = 0;
        //循环执行程序
        while(true){
            //nume()是一个被子类所重写的方法,这里实现了动态绑定,执行的是子类的nume方法
            //chose是一个整数,来接收你的选择
            chose = user.nume();
            //根据你的选择来执行对应的行为
            user.operation[chose].work(Bookcase);//chose作为下标,与对应的选项想呼应
        }
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值