一、团队成员

  • 小王:负责需求分析与图书类(Book)、系统核心类(LibrarySystem)设计
  • 小董:负责用户类(User)设计与控制台界面(View)实现

二、结对编程介绍

结对编程是一种敏捷开发技术,由两名开发者组成一对,轮流担任 “驾驶员”(编写代码、控制开发流程)和 “领航员”(审查代码、提供思路、规避风险),通过实时协作减少代码缺陷、提升开发效率,同时促进知识共享。本项目中,我们通过结对编程模式,高效完成了需求拆解、类结构设计与功能实现,确保系统逻辑清晰、代码可维护。

三、Java 实现简易图书馆管理系统(功能模块)

(一)分析

系统核心需求为图书管理(增删改查图书信息)和用户管理(读者借阅、归还图书、查询借阅记录)。采用面向对象思想设计:

  1. Book类:封装图书属性(编号、书名、作者、出版社、借阅状态)及相关方法;
  2. User类:封装用户属性(编号、姓名、借阅图书列表)及借阅 / 归还图书的核心逻辑;
  3. LibrarySystem类:整合图书与用户的管理功能(增删改查、数据存储);
  4. LibrarySystemView类:提供控制台交互界面,接收用户输入并展示操作结果。

(二)代码实现

1. 图书类(Book.java)

java运行

// 图书实体类:封装图书属性与状态
public class Book {
    private String bookId;       // 图书编号(唯一标识)
    private String title;        // 书名
    private String author;       // 作者
    private String publisher;    // 出版社
    private boolean isAvailable; // 是否可借阅(默认可借阅)

    // 构造方法
    public Book(String bookId, String title, String author, String publisher) {
        this.bookId = bookId;
        this.title = title;
        this.author = author;
        this.publisher = publisher;
        this.isAvailable = true; // 新增图书默认可借阅
    }

    // getter/setter方法
    public String getBookId() {
        return bookId;
    }

    public void setBookId(String bookId) {
        this.bookId = bookId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

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

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public boolean isAvailable() {
        return isAvailable;
    }

    public void setAvailable(boolean available) {
        isAvailable = available;
    }

    // 重写toString:格式化图书信息输出
    @Override
    public String toString() {
        String status = isAvailable ? "可借阅" : "已借出";
        return String.format("[图书编号]%s | [书名]%s | [作者]%s | [出版社]%s | [状态]%s",
                bookId, title, author, publisher, status);
    }
}
2. 用户类(User.java)

java运行

import java.util.ArrayList;
import java.util.List;

// 用户实体类:封装用户属性与借阅/归还逻辑
public class User {
    private String userId;                // 用户编号(唯一标识)
    private String name;                  // 用户名
    private List<Book> borrowedBooks;     // 已借阅图书列表

    // 构造方法
    public User(String userId, String name) {
        this.userId = userId;
        this.name = name;
        this.borrowedBooks = new ArrayList<>(); // 初始化借阅列表
    }

    // 借阅图书方法
    public String borrowBook(Book book) {
        if (book == null) {
            return "借阅失败:图书不存在!";
        }
        if (book.isAvailable()) {
            book.setAvailable(false); // 标记图书为已借出
            borrowedBooks.add(book);  // 添加到用户借阅列表
            return "借阅成功!";
        } else {
            return "借阅失败:该图书已被借出!";
        }
    }

    // 归还图书方法
    public String returnBook(String bookId) {
        for (Book book : borrowedBooks) {
            if (book.getBookId().equals(bookId)) {
                book.setAvailable(true); // 标记图书为可借阅
                borrowedBooks.remove(book); // 从借阅列表移除
                return "归还成功!";
            }
        }
        return "归还失败:未借阅该图书!";
    }

    // getter方法(仅暴露必要属性访问)
    public String getUserId() {
        return userId;
    }

    public String getName() {
        return name;
    }

    public List<Book> getBorrowedBooks() {
        return borrowedBooks;
    }
}
3. 系统核心类(LibrarySystem.java)

java运行

import java.util.ArrayList;
import java.util.List;

// 图书馆系统核心类:整合图书与用户管理功能
public class LibrarySystem {
    // 存储图书与用户数据(内存存储,重启后数据丢失)
    private List<Book> bookList = new ArrayList<>();
    private List<User> userList = new ArrayList<>();

    // ---------------------- 图书管理功能 ----------------------
    // 添加图书
    public void addBook(Book book) {
        bookList.add(book);
    }

    // 查询图书:空参数查询所有,传入编号查询指定图书
    public List<Book> queryBook(String bookId) {
        List<Book> result = new ArrayList<>();
        if (bookId == null || bookId.trim().isEmpty()) {
            result.addAll(bookList); // 查询所有图书
        } else {
            for (Book book : bookList) {
                if (book.getBookId().equals(bookId)) {
                    result.add(book);
                }
            }
        }
        return result;
    }

    // 修改图书信息
    public boolean modifyBook(String bookId, String newTitle, String newAuthor, String newPublisher) {
        for (Book book : bookList) {
            if (book.getBookId().equals(bookId)) {
                book.setTitle(newTitle);
                book.setAuthor(newAuthor);
                book.setPublisher(newPublisher);
                return true; // 修改成功
            }
        }
        return false; // 未找到图书,修改失败
    }

    // 删除图书:仅允许删除未被借出的图书
    public boolean deleteBook(String bookId) {
        for (Book book : bookList) {
            if (book.getBookId().equals(bookId) && book.isAvailable()) {
                bookList.remove(book);
                return true; // 删除成功
            }
        }
        return false; // 图书不存在或已借出,删除失败
    }

    // ---------------------- 用户管理功能 ----------------------
    // 添加用户
    public void addUser(User user) {
        userList.add(user);
    }

    // 根据用户编号查询用户
    public User getUserById(String userId) {
        for (User user : userList) {
            if (user.getUserId().equals(userId)) {
                return user;
            }
        }
        return null; // 未找到用户
    }

    // 根据图书编号查询图书(供借阅/归还功能调用)
    public Book getBookById(String bookId) {
        for (Book book : bookList) {
            if (book.getBookId().equals(bookId)) {
                return book;
            }
        }
        return null; // 未找到图书
    }
}
4. 控制台界面类(LibrarySystemView.java)

java运行

import java.util.List;
import java.util.Scanner;

// 控制台交互界面:负责接收用户输入与结果展示
public class LibrarySystemView {
    private LibrarySystem librarySystem;
    private Scanner scanner;

    // 构造方法:初始化系统与输入流
    public LibrarySystemView(LibrarySystem librarySystem) {
        this.librarySystem = librarySystem;
        this.scanner = new Scanner(System.in);
    }

    // 显示主菜单(程序入口)
    public void showMainMenu() {
        while (true) {
            System.out.println("\n===== 图书馆管理系统 =====");
            System.out.println("1. 图书管理");
            System.out.println("2. 用户管理");
            System.out.println("3. 退出系统");
            System.out.print("请选择功能(1-3):");
            String choice = scanner.nextLine().trim();

            switch (choice) {
                case "1":
                    showBookManagementMenu(); // 进入图书管理子菜单
                    break;
                case "2":
                    showUserManagementMenu(); // 进入用户管理子菜单
                    break;
                case "3":
                    System.out.println("感谢使用,再见!");
                    scanner.close(); // 关闭输入流
                    System.exit(0); // 退出程序
                    break;
                default:
                    System.out.println("输入无效,请重新选择!");
            }
        }
    }

    // 图书管理子菜单
    private void showBookManagementMenu() {
        while (true) {
            System.out.println("\n===== 图书管理 =====");
            System.out.println("1. 添加图书");
            System.out.println("2. 查询图书");
            System.out.println("3. 修改图书");
            System.out.println("4. 删除图书");
            System.out.println("5. 返回主菜单");
            System.out.print("请选择功能(1-5):");
            String choice = scanner.nextLine().trim();

            switch (choice) {
                case "1":
                    addBook();
                    break;
                case "2":
                    queryBook();
                    break;
                case "3":
                    modifyBook();
                    break;
                case "4":
                    deleteBook();
                    break;
                case "5":
                    return; // 返回主菜单
                default:
                    System.out.println("输入无效,请重新选择!");
            }
        }
    }

    // 添加图书
    private void addBook() {
        System.out.print("请输入图书编号:");
        String bookId = scanner.nextLine().trim();
        System.out.print("请输入书名:");
        String title = scanner.nextLine().trim();
        System.out.print("请输入作者:");
        String author = scanner.nextLine().trim();
        System.out.print("请输入出版社:");
        String publisher = scanner.nextLine().trim();

        librarySystem.addBook(new Book(bookId, title, author, publisher));
        System.out.println("图书添加成功!");
    }

    // 查询图书
    private void queryBook() {
        System.out.print("请输入图书编号(直接回车查询所有图书):");
        String bookId = scanner.nextLine().trim();

        List<Book> books = librarySystem.queryBook(bookId);
        if (books.isEmpty()) {
            System.out.println("未找到相关图书!");
            return;
        }

        System.out.println("\n===== 查询结果 =====");
        for (Book book : books) {
            System.out.println(book);
        }
    }

    // 修改图书
    private void modifyBook() {
        System.out.print("请输入要修改的图书编号:");
        String bookId = scanner.nextLine().trim();

        List<Book> books = librarySystem.queryBook(bookId);
        if (books.isEmpty()) {
            System.out.println("未找到该图书,修改失败!");
            return;
        }

        Book targetBook = books.get(0);
        System.out.println("当前图书信息:" + targetBook);

        System.out.print("请输入新书名(直接回车保持原信息):");
        String newTitle = scanner.nextLine().trim();
        if (newTitle.isEmpty()) newTitle = targetBook.getTitle();

        System.out.print("请输入新作者(直接回车保持原信息):");
        String newAuthor = scanner.nextLine().trim();
        if (newAuthor.isEmpty()) newAuthor = targetBook.getAuthor();

        System.out.print("请输入新出版社(直接回车保持原信息):");
        String newPublisher = scanner.nextLine().trim();
        if (newPublisher.isEmpty()) newPublisher = targetBook.getPublisher();

        boolean success = librarySystem.modifyBook(bookId, newTitle, newAuthor, newPublisher);
        if (success) {
            System.out.println("图书修改成功!");
        } else {
            System.out.println("图书修改失败!");
        }
    }

    // 删除图书
    private void deleteBook() {
        System.out.print("请输入要删除的图书编号:");
        String bookId = scanner.nextLine().trim();

        boolean success = librarySystem.deleteBook(bookId);
        if (success) {
            System.out.println("图书删除成功!");
        } else {
            System.out.println("删除失败:图书不存在或已被借出!");
        }
    }

    // 用户管理子菜单
    private void showUserManagementMenu() {
        while (true) {
            System.out.println("\n===== 用户管理 =====");
            System.out.println("1. 添加用户");
            System.out.println("2. 借阅图书");
            System.out.println("3. 归还图书");
            System.out.println("4. 查看借阅记录");
            System.out.println("5. 返回主菜单");
            System.out.print("请选择功能(1-5):");
            String choice = scanner.nextLine().trim();

            switch (choice) {
                case "1":
                    addUser();
                    break;
                case "2":
                    borrowBook();
                    break;
                case "3":
                    returnBook();
                    break;
                case "4":
                    viewBorrowRecord();
                    break;
                case "5":
                    return; // 返回主菜单
                default:
                    System.out.println("输入无效,请重新选择!");
            }
        }
    }

    // 添加用户
    private void addUser() {
        System.out.print("请输入用户编号:");
        String userId = scanner.nextLine().trim();
        System.out.print("请输入用户名:");
        String name = scanner.nextLine().trim();

        librarySystem.addUser(new User(userId, name));
        System.out.println("用户添加成功!");
    }

    // 借阅图书
    private void borrowBook() {
        System.out.print("请输入用户编号:");
        String userId = scanner.nextLine().trim();
        System.out.print("请输入要借阅的图书编号:");
        String bookId = scanner.nextLine().trim();

        User user = librarySystem.getUserById(userId);
        Book book = librarySystem.getBookById(bookId);

        if (user == null) {
            System.out.println("借阅失败:用户不存在!");
            return;
        }

        String result = user.borrowBook(book);
        System.out.println(result);
    }

    // 归还图书
    private void returnBook() {
        System.out.print("请输入用户编号:");
        String userId = scanner.nextLine().trim();
        System.out.print("请输入要归还的图书编号:");
        String bookId = scanner.nextLine().trim();

        User user = librarySystem.getUserById(userId);
        if (user == null) {
            System.out.println("归还失败:用户不存在!");
            return;
        }

        String result = user.returnBook(bookId);
        System.out.println(result);
    }

    // 查看借阅记录
    private void viewBorrowRecord() {
        System.out.print("请输入用户编号:");
        String userId = scanner.nextLine().trim();

        User user = librarySystem.getUserById(userId);
        if (user == null) {
            System.out.println("查询失败:用户不存在!");
            return;
        }

        List<Book> borrowedBooks = user.getBorrowedBooks();
        if (borrowedBooks.isEmpty()) {
            System.out.println("该用户暂无借阅记录!");
            return;
        }

        System.out.println("\n===== " + user.getName() + " 的借阅记录 =====");
        for (Book book : borrowedBooks) {
            System.out.println(book);
        }
    }

    // 程序入口
    public static void main(String[] args) {
        LibrarySystem system = new LibrarySystem();
        LibrarySystemView view = new LibrarySystemView(system);
        view.showMainMenu(); // 启动系统,显示主菜单
    }
}

四、实现说明

1. 运行环境

  • JDK 8 及以上版本(确保支持 Lambda 表达式、ArrayList 等基础 API)
  • 开发工具:IntelliJ IDEA、Eclipse 等 Java IDE

2. 运行步骤

  1. 创建 Java 项目,新建 4 个 Java 类(Book.javaUser.javaLibrarySystem.javaLibrarySystemView.java);
  2. 运行LibrarySystemView.javamain方法,启动系统;
  3. 通过控制台菜单选择功能,按提示输入相关信息(如图书编号、用户名等),完成操作。

3. 核心功能演示

  • 添加图书:主菜单→1→1,输入图书编号、书名、作者、出版社,即可完成添加;
  • 借阅图书:主菜单→2→2,输入用户编号和图书编号,若图书可借阅则借阅成功;
  • 查看借阅记录:主菜单→2→4,输入用户编号,即可查看该用户已借阅的所有图书;
  • 删除图书:主菜单→1→4,输入图书编号,仅当图书未被借出时可删除。

五、总结

1. 结对编程优势

  • 需求拆解更高效:两人协作明确了 “实体类 - 核心逻辑 - 界面交互” 的三层结构,避免单一思路的局限;
  • 代码质量更高:“驾驶员” 编写代码时,“领航员” 实时审查,减少了空指针、逻辑遗漏等问题;
  • 知识互补:一人擅长 Java 基础语法,一人熟悉集合操作,协作中相互学习,提升开发效率。

2. 系统特点

  • 面向对象设计:类职责单一(Book 封装图书属性、User 封装用户行为),模块解耦,便于扩展;
  • 交互友好:控制台菜单层级清晰,操作提示明确,支持 “回车保持原信息” 等便捷操作;
  • 逻辑严谨:借阅时校验图书状态,删除时校验图书是否借出,避免数据不一致。

3. 优化方向

  • 数据持久化:当前数据存储在内存中,重启后丢失,可通过文件(如 CSV、JSON)或数据库(如 MySQL)实现数据持久化;
  • 图形界面:引入 Swing 或 JavaFX 替换控制台界面,提升用户体验;
  • 功能扩展:新增图书分类、借阅期限提醒、管理员权限控制等功能,贴近实际图书馆场景。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐