个人理解装饰者模式: 1.装饰者模式的本质,就是按开闭原则去写,在不改变原有的类,而去拓展新的类,增加新的功能
例子
// Book 继承 IBook
public class Book extends IBook {
@Override
void borrowBook() {
System.out.println(getBookName() + "被借了");
}
@Override
void returnBook() {
System.out.println(getBookName() + "归还了");
}
}
// 新建一个抽象类
public abstract class IBook {
private String bookName;
abstract void borrowBook();
abstract void returnBook();
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
public class NewBook {
/**
* 注意了,核心代码就是这段,使用组合的方式扩展Book
* 根据开闭原则:不改变原有的类(不改变Book 的基础新建一个 NewBook类)
* 在NewBook 类上扩展功能(比如: freeze() 和 lose() )
* 不用继承的方式继承Book,用组合的方式持有Book, 既有Book的功能,有可以扩展新功能
*/
private IBook iBook;
private void setIBook(IBook iBook) {
this.iBook = iBook;
}
public void freeze() {
System.out.println(iBook.getBookName() + "冻结了");
}
public void lose() {
System.out.println(iBook.getBookName() + "丢失了");
}
// 这里可以用委托方式去实现Book 的两个方法
// 阅读起来会更好,但是这里主要要让各位把装饰者模式看起来更清晰
// 所以注释了
// public void borrowBook() {
// iBook.borrowBook();
// }
//
//
// public void returnBook() {
// iBook.returnBook();
// }
}
public static void main(String[] args) {
// IBook iBook = new Book();
// iBook.setBookName("《设计者模式》 ");
// 看到没,在Book原有的基础上,新扩展NewBook ,
// 不影响原有的类,也遵循开闭原则,用组合的方式
NewBook newBook = new NewBook();
newBook.setIBook(new Book());
newBook.iBook.setBookName("《设计者模式》 ");
newBook.iBook.borrowBook();
newBook.lose();
newBook.freeze();
newBook.iBook.returnBook();
}
}
这里最主要的就是 NewBook类中的IBook 变量,仔细阅读下面的话
/**
* 注意了,核心代码就是这段,使用组合的方式扩展Book
* 根据开闭原则:不改变原有的类(不改变Book 的基础新建一个 NewBook类)
* 在NewBook 类上扩展功能(比如: freeze() 和 lose() )
* 不用继承的方式继承Book,用组合的方式持有Book, 既有Book的功能,有可以扩展新功能
*/
private IBook iBook;