parent
c1ffe8c62f
commit
49ea2bbb08
@ -0,0 +1,62 @@
|
||||
package com.library.model;
|
||||
|
||||
/**
|
||||
* Book实体类
|
||||
*/
|
||||
public class Book {
|
||||
private String isbn;
|
||||
private String title;
|
||||
private String author;
|
||||
private boolean available;
|
||||
|
||||
public Book(String isbn, String title, String author) {
|
||||
this.isbn = isbn;
|
||||
this.title = title;
|
||||
this.author = author;
|
||||
this.available = true;
|
||||
}
|
||||
|
||||
// Getters and Setters
|
||||
public String getIsbn() {
|
||||
return isbn;
|
||||
}
|
||||
|
||||
public void setIsbn(String isbn) {
|
||||
this.isbn = isbn;
|
||||
}
|
||||
|
||||
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 boolean isAvailable() {
|
||||
return available;
|
||||
}
|
||||
|
||||
public void setAvailable(boolean available) {
|
||||
this.available = available;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Book{" +
|
||||
"isbn='" + isbn + '\'' +
|
||||
", title='" + title + '\'' +
|
||||
", author='" + author + '\'' +
|
||||
", available=" + available +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,68 @@
|
||||
package com.library.model;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Member实体类
|
||||
*/
|
||||
public class Member {
|
||||
private String memberId;
|
||||
private String name;
|
||||
private String email;
|
||||
private List<Book> borrowedBooks;
|
||||
|
||||
public Member(String memberId, String name, String email) {
|
||||
this.memberId = memberId;
|
||||
this.name = name;
|
||||
this.email = email;
|
||||
this.borrowedBooks = new ArrayList<>();
|
||||
}
|
||||
|
||||
// Getters and Setters
|
||||
public String getMemberId() {
|
||||
return memberId;
|
||||
}
|
||||
|
||||
public void setMemberId(String memberId) {
|
||||
this.memberId = memberId;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public List<Book> getBorrowedBooks() {
|
||||
return new ArrayList<>(borrowedBooks);
|
||||
}
|
||||
|
||||
public void addBorrowedBook(Book book) {
|
||||
this.borrowedBooks.add(book);
|
||||
}
|
||||
|
||||
public void removeBorrowedBook(Book book) {
|
||||
this.borrowedBooks.remove(book);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Member{" +
|
||||
"memberId='" + memberId + '\'' +
|
||||
", name='" + name + '\'' +
|
||||
", email='" + email + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,18 @@
|
||||
package com.library.repository;
|
||||
|
||||
import com.library.model.Book;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 书籍仓储接口 - 遵循Dependency Inversion Principle
|
||||
*/
|
||||
public interface BookRepository {
|
||||
void save(Book book);
|
||||
Optional<Book> findByIsbn(String isbn);
|
||||
List<Book> findAll();
|
||||
List<Book> findByAuthor(String author);
|
||||
void delete(Book book);
|
||||
}
|
||||
|
||||
@ -0,0 +1,45 @@
|
||||
package com.library.repository;
|
||||
|
||||
import com.library.model.Book;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 内存中的书籍仓储实现
|
||||
*/
|
||||
public class InMemoryBookRepository implements BookRepository {
|
||||
private Map<String, Book> books;
|
||||
|
||||
public InMemoryBookRepository() {
|
||||
this.books = new HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(Book book) {
|
||||
books.put(book.getIsbn(), book);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Book> findByIsbn(String isbn) {
|
||||
return Optional.ofNullable(books.get(isbn));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Book> findAll() {
|
||||
return new ArrayList<>(books.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Book> findByAuthor(String author) {
|
||||
return books.values().stream()
|
||||
.filter(book -> book.getAuthor().equals(author))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(Book book) {
|
||||
books.remove(book.getIsbn());
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,37 @@
|
||||
package com.library.repository;
|
||||
|
||||
import com.library.model.Member;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 内存中的会员仓储实现
|
||||
*/
|
||||
public class InMemoryMemberRepository implements MemberRepository {
|
||||
private Map<String, Member> members;
|
||||
|
||||
public InMemoryMemberRepository() {
|
||||
this.members = new HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(Member member) {
|
||||
members.put(member.getMemberId(), member);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Member> findByMemberId(String memberId) {
|
||||
return Optional.ofNullable(members.get(memberId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Member> findAll() {
|
||||
return new ArrayList<>(members.values());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(Member member) {
|
||||
members.remove(member.getMemberId());
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,17 @@
|
||||
package com.library.repository;
|
||||
|
||||
import com.library.model.Member;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 会员仓储接口
|
||||
*/
|
||||
public interface MemberRepository {
|
||||
void save(Member member);
|
||||
Optional<Member> findByMemberId(String memberId);
|
||||
List<Member> findAll();
|
||||
void delete(Member member);
|
||||
}
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
package com.library.service;
|
||||
|
||||
/**
|
||||
* 邮件通知服务实现
|
||||
*/
|
||||
public class EmailNotificationService implements NotificationService {
|
||||
@Override
|
||||
public void sendEmail(String to, String subject, String message) {
|
||||
System.out.println("Sending email to: " + to);
|
||||
System.out.println("Subject: " + subject);
|
||||
System.out.println("Message: " + message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
package com.library.service;
|
||||
|
||||
import com.library.model.Member;
|
||||
import com.library.repository.MemberRepository;
|
||||
|
||||
/**
|
||||
* 到期提醒服务 - 遵循Single Responsibility Principle
|
||||
*/
|
||||
public class EmailReminderService {
|
||||
private MemberRepository memberRepository;
|
||||
private NotificationService notificationService;
|
||||
|
||||
public EmailReminderService(MemberRepository memberRepository, NotificationService notificationService) {
|
||||
this.memberRepository = memberRepository;
|
||||
this.notificationService = notificationService;
|
||||
}
|
||||
|
||||
public void sendDueReminder(String memberId) {
|
||||
var memberOpt = memberRepository.findByMemberId(memberId);
|
||||
if (memberOpt.isPresent()) {
|
||||
Member member = memberOpt.get();
|
||||
notificationService.sendEmail(
|
||||
member.getEmail(),
|
||||
"Book Due Reminder",
|
||||
"Dear " + member.getName() + ", please return your borrowed books."
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,79 @@
|
||||
package com.library.service;
|
||||
|
||||
import com.library.model.Book;
|
||||
import com.library.model.Member;
|
||||
import com.library.repository.BookRepository;
|
||||
import com.library.repository.MemberRepository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 图书馆服务类 - 遵循Single Responsibility Principle
|
||||
* 只负责图书借还业务逻辑
|
||||
*/
|
||||
public class LibraryService {
|
||||
private BookRepository bookRepository;
|
||||
private MemberRepository memberRepository;
|
||||
|
||||
public LibraryService(BookRepository bookRepository, MemberRepository memberRepository) {
|
||||
this.bookRepository = bookRepository;
|
||||
this.memberRepository = memberRepository;
|
||||
}
|
||||
|
||||
public boolean borrowBook(String memberId, String isbn) {
|
||||
Optional<Member> memberOpt = memberRepository.findByMemberId(memberId);
|
||||
Optional<Book> bookOpt = bookRepository.findByIsbn(isbn);
|
||||
|
||||
if (memberOpt.isEmpty() || bookOpt.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Book book = bookOpt.get();
|
||||
if (!book.isAvailable()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Member member = memberOpt.get();
|
||||
book.setAvailable(false);
|
||||
member.addBorrowedBook(book);
|
||||
bookRepository.save(book);
|
||||
memberRepository.save(member);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean returnBook(String memberId, String isbn) {
|
||||
Optional<Member> memberOpt = memberRepository.findByMemberId(memberId);
|
||||
Optional<Book> bookOpt = bookRepository.findByIsbn(isbn);
|
||||
|
||||
if (memberOpt.isEmpty() || bookOpt.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Member member = memberOpt.get();
|
||||
Book book = bookOpt.get();
|
||||
|
||||
if (!member.getBorrowedBooks().contains(book)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
book.setAvailable(true);
|
||||
member.removeBorrowedBook(book);
|
||||
bookRepository.save(book);
|
||||
memberRepository.save(member);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<Book> getAvailableBooks() {
|
||||
return bookRepository.findAll().stream()
|
||||
.filter(Book::isAvailable)
|
||||
.toList();
|
||||
}
|
||||
|
||||
public List<Book> searchBooksByAuthor(String author) {
|
||||
return bookRepository.findByAuthor(author);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
package com.library.service;
|
||||
|
||||
/**
|
||||
* 通知服务接口 - 遵循Interface Segregation Principle
|
||||
*/
|
||||
public interface NotificationService {
|
||||
void sendEmail(String to, String subject, String message);
|
||||
}
|
||||
|
||||
Loading…
Reference in new issue