裝飾者(Decorator)模式:動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更具有彈性的替代方案。對于裝飾者模式,它其實是一種包裝,所以我更愿意稱它為一種包裝。像咱們以前經常使用的Java里面的IO流就用到了裝飾者模式。比如:BufferedReader?br = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));這里file1為目標對象,而像BufferedReader、InputStreamReader就可以稱之為包裝類。下面舉例說明:
## 一、UML模型圖

## 二、代碼實現
~~~
/**
* 對修改關閉,對擴展開放。
*
* 統一接口
*/
interface Filterable {
public void filter();
}
/**
* 目標類
*/
class Filter implements Filterable {
@Override
public void filter() {
System.out.println("目標類的核心過濾方法...");
}
}
/**
* DecoratorForFilter1包裝類與目標類實現相同的接口 --> 織入Log
*/
class DecoratorForFilter1 implements Filterable {
private Filterable filterable;
public DecoratorForFilter1(Filterable filterable) {
this.filterable = filterable;
}
private void beforeMethod() {
System.out.println("DecoratorForFilter1 --> 核心過濾方法執行前執行");
}
private void afterMethod() {
System.out.println("DecoratorForFilter1 --> 核心過濾方法執行后執行");
}
@Override
public void filter() {
beforeMethod();
filterable.filter();
afterMethod();
}
}
/**
* DecoratorForFilter2包裝類與目標類實現相同的接口 --> 織入Log
*/
class DecoratorForFilter2 implements Filterable {
private Filterable filterable;
public DecoratorForFilter2(Filterable filterable) {
this.filterable = filterable;
}
private void beforeMethod() {
System.out.println("DecoratorForFilter2 --> 核心過濾方法執行前執行");
}
private void afterMethod() {
System.out.println("DecoratorForFilter2 --> 核心過濾方法執行后執行");
}
@Override
public void filter() {
beforeMethod();
filterable.filter();
afterMethod();
}
}
/**
* 客戶端測試類
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
/**
* 目標對象
*/
Filterable targetObj = new Filter();
/**
* 包裝對象(對目標對象進行包裝)
*/
Filterable decorObj = new DecoratorForFilter1(new DecoratorForFilter2(
targetObj));
/**
* 執行包裝后的業務方法
*/
decorObj.filter();
}
}
~~~
輸出:
DecoratorForFilter1 --> 核心過濾方法執行前執行
DecoratorForFilter2 --> 核心過濾方法執行前執行
目標類的核心過濾方法...
DecoratorForFilter2 --> 核心過濾方法執行后執行
DecoratorForFilter1 --> 核心過濾方法執行后執行
## 三、應用場景(僅代表個人觀點)
I/O、過濾器
## 四、小結
通過輸入的Log我們可以看到:輸出的過程其實是將包裝類“拆包”的過程,就像包裝袋一樣一層一層的拆開。
設計原則:1)多用組合,少用繼承。2)對擴展開放,對修改關閉。
- 前言
- (一)策略模式建模與實現
- (二)觀察者模式建模與實現
- (三)裝飾者模式建模與實現
- (四)工廠方法模式建模與實現
- (五)抽象工廠模式建模與實現
- (六)單例模式建模與實現
- (七)命令模式建模與實現
- (八)適配器模式建模與實現
- (九)外觀模式建模與實現
- (十)模板方法模式建模與實現
- (十一)迭代器模式建模與實現
- (十二)組合模式建模與實現
- (十三)狀態模式建模與實現
- (十四)代理模式建模與實現
- (十五)建造者模式建模與實現
- (十六)原型模式建模與實現
- (十七)橋接模式建模與實現
- (十八)責任鏈模式建模與實現
- (十九)備忘錄模式建模與實現
- (二十)解釋器模式建模與實現
- (二十一)享元模式建模與實現
- (二十二)中介者模式建模與實現
- (二十三)訪問者模式建模與實現
- Java設計模式博客全目錄