設計模式之9--裝飾者模式
裝飾者模式筆記
裝飾者模式是在不改變原類檔案和不使用繼承的情況下,動態地擴充套件一個物件的功能。它通過建立一個包裝物件,持有一個真實物件的引用,進而來裝飾包裹真實的物件。
裝飾模式是一種用於替代繼承的技術,通過一種無需定義子類的方法來給物件動態增加職責,使用物件之間的關聯關係取代類之間的繼承關係。在裝飾模式中引入了裝飾類,在裝飾類中既可以呼叫被裝飾的原有類的方法,還可以增加新的方法,以擴充原有類的功能。
定義:動態地給一個物件增加一些額外的職責,就增加物件功能來說,裝飾模式比生成子類實現更為靈活。裝飾模式是一種物件結構型模式。
可以通過下圖瞭解裝飾模式的結構圖:
從上面的的結構圖中看到包含以下幾個角色:
Component抽象構件:它是具體構件和抽象裝飾類的共同父類,它聲明瞭需要在具體構件中實現的方法。
ConcreteComponent具體構件:實現在抽象構件中宣告的方法,而裝飾類在執行期間實際上也是針對具體構件進行裝飾的。
Decorator抽象裝飾類:抽象裝飾類作為抽象構件的子類,同樣含有父類宣告的方法,而同時它持有一個具體構件的引用,可以通過該引用呼叫裝飾前的具體構件的方法,然後在子類中擴充套件該方法,實現裝飾擴充套件的效果。
ConcreteDecorator具體裝飾類:抽象裝飾類的子類,實現具體的職責或者增加新的行為。
實現程式碼如下:
class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation(){
component.operation();
}
}
class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
public void operation(){
super.operation();
addedBehavior()//在具體裝飾類裡面可以增加新的行為擴充套件該方法達到裝飾的目的。
}
public void addedBehavior() { };
}
class Client {
public static void main(String args[]) {
Component component = new ConcreteComponent();
Component comDecorator = new ConcreteDecorator(component);
//從上面可以看出 建立的所有物件都可以使用抽象構件來表示,因為都是它的子類,因此對於來說透明。
comDecorator.operation();
}
}
如果需要在原有的系統上新增新的具體構件類或者新的具體裝飾類也很簡單,通過裝飾模式可以大大減少系統中的子類的個數。
對於在具體裝飾類中增加介面行為,如果客戶端想單獨呼叫的話那麼就不能簡單的都通過抽象構件去宣告,因為抽象構件是不含有這個方法的。這裡就需要分透明裝飾模式和非透明裝飾模式。
總結:
裝飾模式可以替代繼承方法來動態的擴充套件一個物件的功能。在透明裝飾模式中,因為具體裝飾類和具體構件類都是抽象構件類的子類,因為在客戶端看來是透明的,沒有區別。而如果後續增加功能直接新增具體裝飾類即可,無需更改原有的程式碼。