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输入无效,请输入正确的操作编号!")
}
}