Java程序員們應該對java.io對不會陌生炸卑,因為java.io包采用了裝飾器模式亡蓉。
一、定義:
Decorator裝飾器瞳浦,顧名思義担映,就是動態(tài)地給一個對象添加一些額外的職責,就好比為房子進行裝修一樣叫潦。因此蝇完,裝飾器模式具有如下的特征:
- 它必須具有一個裝飾的對象
- 它必須擁有與被裝飾對象相同的接口。
- 它可以給被裝飾對象添加額外的功能
用一句話總結就是:保持接口矗蕊,增強性能短蜕。
二、 典型的裝飾器模式的圖:
三傻咖、相關實例:
1朋魔、 Sourcable接口定義了一個方法 operation() 。
package pattern.decorator;
public interface Sourcable {
public void operation();
}
2卿操、被裝飾對象: Source.java 是 Sourcable.java 的一個實現(xiàn)警检, operation() 方法的實現(xiàn)就是簡單的負責往控制臺輸出一個字符串:
public class Source implements Sourcable {
public void operation() {
System.out.println("原始類的方法");
}
}
3孙援、裝飾器類 Decorator1.java 采用了典型的對象適配器模式,它首先擁有一個 Sourcable 對象 source 扇雕,該對象通過構造函 數(shù)進行初始化拓售。然后它實現(xiàn)了 Sourcable.java 接口,以期保持與 source 同樣的接口镶奉,并在重寫的operation() 方法中調用 source 的 operation() 函數(shù)础淤,在調用前后可以實現(xiàn)自己的輸出,這就是裝飾器所擴展的功能哨苛。
public class Decorator1 implements Sourcable {
private Sourcable sourcable;
public Decorator1(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第1個裝飾器前");
sourcable.operation();
System.out.println("第1個裝飾器后");
}
}
裝飾器類Decorator2.java 是另一個裝飾器值骇,不同的是它裝飾的內容不一樣,即輸出了不同的字符串移国。其源代碼如
public class Decorator2 implements Sourcable {
private Sourcable sourcable;
public Decorator2(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第2個裝飾器前");
sourcable.operation();
System.out.println("第2個裝飾器后");
}
}
裝飾器類Decorator3.java 是第三個裝飾器吱瘩,不同的是它裝飾的內容不一樣,即輸出了不同的字符串迹缀。其源代碼如程序
public class Decorator3 implements Sourcable {
private Sourcable sourcable;
public Decorator3(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第3個裝飾器前");
sourcable.operation();
System.out.println("第3個裝飾器后");
}
}
這時使碾,我們就可以像使用對象的適配器模式一樣來使用這些裝飾器,使用不同的裝飾器就可以達到不同的裝飾效果祝懂。如下測試類:首先需要創(chuàng)建一 個源類對象 source 票摇,然后根據(jù)將對象使用 Decorator1 來裝飾,并以此使用Decorator2 砚蓬、 Decorator3 進行裝飾矢门,裝飾后的對象同樣具有與 source 同樣的接口。
public class DecoratorTest {
/**
* @param args
*/
public static void main(String[] args) {
Sourcable source = new Source();
// 裝飾類對象
Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));
obj.operation();
}
}
程序運行結果:
第1 個裝飾器裝飾前
第2 個裝飾器裝飾前
第3 個裝飾器裝飾前
原始類的方法
第3 個裝飾器裝飾后
第2 個裝飾器裝飾后
第1 個裝飾器裝飾后
總結:
裝飾器類:使用被裝飾器對象作為成員變量灰蛙,同時實現(xiàn)相同的接口祟剔。實現(xiàn)相同的接口,做成員變量