图书馆案例-Map篇

37 阅读2分钟

1. 建立一个名为service的软件包,其中去建立一个bookService的类,用它来实现与图书相关的业务逻辑

2. 建立一个名为models的软件包。其中去建立一个bookModel的样例类,用它来实现图书对象。

3. 建立一个名为dao的软件包。其中去建立一个bookDAO的类,用它来实现对图书的文件读写。

4. 修改ui层的代码:在用户输入1之后,去调用bookService的相关方法去读出所有图书,并显示出来。

Map篇

图书样例类,封装图书核心属性:

@param id 图书ID

@param name 图书名称

@param author 作者

@param price 价格

@param category 分类

package models
case class BookModel(
                      id: String,
                      name: String,
                      author: String,
                      price: Double,
                      category: String
                    )

dao 包 - BookDAO.scala(数据访问层:文件读写)

package dao

import models.BookModel
import scala.io.Source
import java.io.{File, PrintWriter}
import scala.util.Try

/**
 * 图书数据访问对象,负责图书数据的文件持久化操作
 */
class BookDAO {
  // 图书数据存储文件路径(可根据实际情况修改)
  private val bookFile = new File("books.txt")

  /**
   * 从文件中读取所有图书
   * @return 图书列表(读取失败返回空列表)
   */
  def readAllBooks(): List[BookModel] = {
    // 若文件不存在,创建空文件并返回空列表
    if (!bookFile.exists()) {
      bookFile.createNewFile()
      return List.empty[BookModel]
    }

    // 读取文件内容,按行解析为BookModel对象
    Source.fromFile(bookFile)
      .getLines()
      .filter(_.nonEmpty)  // 过滤空行
      .map { line =>
        val parts = line.split(",")  // 按逗号分隔字段
        // 解析字段(假设文件格式:id,name,author,price,category)
        BookModel(
          id = parts(0).trim,
          name = parts(1).trim,
          author = parts(2).trim,
          price = parts(3).trim.toDouble,
          category = parts(4).trim
        )
      }
      .toList
  }

  /**
   * 向文件中写入图书(追加模式)
   * @param book 要写入的图书对象
   * @return 写入是否成功
   */
  def writeBook(book: BookModel): Boolean = {
    Try {
      val writer = new PrintWriter(new FileWriter(bookFile, true))  // 追加模式
      try {
        // 按格式写入文件:id,name,author,price,category
        writer.println(s"${book.id},${book.name},${book.author},${book.price},${book.category}")
      } finally {
        writer.close()
      }
    }.isSuccess
  }
}

service 包 - BookService.scala(业务逻辑层)

package service

import models.BookModel
import dao.BookDAO

/**
 * 图书业务逻辑服务,封装图书相关业务操作
 */
class BookService {
  // 依赖注入BookDAO(实际项目中可使用依赖注入框架)
  private val bookDAO = new BookDAO()

  /**
   * 获取所有图书(业务层封装,可添加权限校验、数据过滤等逻辑)
   * @return 图书列表
   */
  def getAllBooks(): List[BookModel] = {
    // 此处可添加业务逻辑,例如:
    // 1. 权限校验(只有管理员能查看所有图书)
    // 2. 数据过滤(隐藏未上架图书)
    // 3. 数据转换(格式化价格、分类名称等)
    bookDAO.readAllBooks()
  }

  /**
   * 添加图书(可选扩展方法)
   * @param book 图书对象
   * @return 添加是否成功
   */
  def addBook(book: BookModel): Boolean = {
    // 业务校验:图书ID不能为空,价格必须大于0
    if (book.id.isEmpty || book.price <= 0) {
      false
    } else {
      bookDAO.writeBook(book)
    }
  }
}

UI 层 - UI.scala(用户交互入口)

import service.BookService
import models.BookModel

object UI extends App {
  // 初始化业务服务
  private val bookService = new BookService()

  // 模拟用户交互菜单
  println("===== 图书管理系统 =====")
  println("1. 查看所有图书")
  println("2. 退出系统")
  print("请输入操作编号:")

  // 读取用户输入
  val input = scala.io.StdIn.readLine().trim

  // 处理用户操作
  input match {
    case "1" =>
      println("\n===== 所有图书列表 =====")
      // 调用Service层方法获取图书列表
      val books = bookService.getAllBooks()

      if (books.isEmpty) {
        println("暂无图书数据!")
      } else {
        // 格式化输出图书信息(使用map转换输出格式)
        books.map { book =>
          s"ID:${book.id}\n" +
            s"书名:${book.name}\n" +
            s"作者:${book.author}\n" +
            s"价格:¥${book.price.formatted("%.2f")}\n" +
            s"分类:${book.category}\n" +
            "------------------------"
        }.foreach(println)
      }

    case "2" =>
      println("\n感谢使用,再见!")

    case _ =>
      println("\n输入无效,请输入正确的操作编号!")
  }
}