在某图书管理系统中,书籍类(Book)具有借书方法borrowBook()和还书方法returnBook(),现需要动态给书籍对象添加冻结方法freeze()和遗失方法lose()。请使用装饰模式设计系统。
说明:
1. Book 是接口,声明了基础操作。
2. ConcreteBook 是实现 Book 接口的具体类,实现了借书和还书的功能。
3. BookDecorator 是抽象装饰者,持有一个 `Book` 的引用。
4. FreezeDecorator 和 LoseDecorator 是具体的装饰者,分别添加了 freeze() 和 lose() 方法。
1、创建书籍接口
// Book.java
public interface Book {
void borrowBook(); // 借书方法
void returnBook(); // 还书方法
String getDescription(); // 获取书籍描述
}
2、创建一个具体的书籍类
// ConcreteBook.java
public class ConcreteBook implements Book {
private String title;
public ConcreteBook(String title) {
this.title = title;
}
@Override
public void borrowBook() {
System.out.println("Borrowing book: " + title);
}
@Override
public void returnBook() {
System.out.println("Returning book: " + title);
}
@Override
public String getDescription() {
return "Book: " + title;
}
}
3、 创建装饰者抽象类
需要一个装饰者抽象类,这个类实现 Book 接口,并包含对 Book 对象的引用。
// BookDecorator.java
public abstract class BookDecorator implements Book {
protected Book book;
public BookDecorator(Book book) {
this.book = book;
}
@Override
public void borrowBook() {
book.borrowBook();
}
@Override
public void returnBook() {
book.returnBook();
}
@Override
public String getDescription() {
return book.getDescription();
}
}
4. 创建具体的装饰者类
实现两个装饰者类来添加新的功能:FreezeDecorator 和 LoseDecorator。
// FreezeDecorator.java
public class FreezeDecorator extends BookDecorator {
public FreezeDecorator(Book book) {
super(book);
}
public void freeze() {
System.out.println("Book " + getDescription() + " is now frozen.");
}
@Override
public String getDescription() {
return super.getDescription() + " (Frozen)";
}
}
// LoseDecorator.java
public class LoseDecorator extends BookDecorator {
public LoseDecorator(Book book) {
super(book);
}
public void lose() {
System.out.println("Book " + getDescription() + " is marked as lost.");
}
@Override
public String getDescription() {
return super.getDescription() + " (Lost)";
}
}
5. 使用装饰者模式
// Test.java
public classTest {
public static void main(String[] args) {
Book book = new ConcreteBook("Java Programming");
book.borrowBook();
// 动态添加冻结功能
Book frozenBook = new FreezeDecorator(book);
frozenBook.borrowBook();
((FreezeDecorator) frozenBook).freeze();
// 动态添加遗失功能
Book lostBook = new LoseDecorator(book);
lostBook.borrowBook();
((LoseDecorator) lostBook).lose();
// 显示书籍描述
System.out.println(frozenBook.getDescription());
System.out.println(lostBook.getDescription());
}
}