三分鐘理解“裝飾模式”——設計模式輕鬆掌握
什麼是裝飾模式?
在執行的過程中,給一個物件動態地新增一些額外的行為。每一個具體的裝飾類都為被裝飾類新增一個功能。
裝飾模式的類圖
1.需要被裝飾的物件所在的類和裝飾類都有一個共同的父類Component,該類中擁有需要新增額外功能的函式:operation();
class ConcreteComponent() extends Component{
public void operation(){
//本函式原本就要做的事情
}
}
2.ConcreteComponent是需要被裝飾的類;Decorator是裝飾類。
3.Decorator類中持有被裝飾物件的引用,客戶端通過setComponent(Component)設定;
4.Decorator類的operation()函式中,執行了被使用者set進去的component物件中的operation()函式,也就是首先執行被裝飾類原本的功能;
class Decorator() extends Component{//需要被裝飾的物件private Component component;//提供給客戶端將需要被裝飾的物件設定進來public void setComponent(Component component){this.component = component;}//執行需要被裝飾物件原本的operation函式public void operation(){this.component.operation();}}
Decorator的子類們的operation()函式,擁有被裝飾類原本的功能和新需要增加的功能。
class ConcreteDecorator() extends Decorator{ //需要被裝飾的物件 private Component component; //提供給客戶端將需要被裝飾的物件設定進來 public void setComponent(Component component){ this.component = component; } //執行需要被裝飾物件原本的operation函式+附加的功能 public void operation(){ //新的功能…………………… super.operation(); //新的功能…………………… } }
客戶端程式碼:
public static void main(String[] args) {
//建立一個需要被裝飾的物件
ConcreteComponent concreteComponent = new ConcreteComponent();
//建立一系列修飾類的物件
Decorator decoratorA = new ConcreteDecoratorA();
Decorator decoratorB = new ConcreteDecoratorB();
//先使用ConcreteDecoratorA包裝被裝飾物件
decoratorA.setComponent(concreteComponent);
//再使用ConcreteDecoratorB包裝decoratorA物件
decoratorB.setComponent(decoratorA);
}
此時,decoratorB物件就是原本需要被裝飾的concreteComponent物件,只不過這個物件的operation()函式在原本operation()的基礎上增加了ConcreteDecoratorA和ConcreteDecoratorB新的功能。
裝飾模式和建造者模式的異同?
相同點:建造者模式和裝飾模式都使用了面向切面程式設計的思想,裝飾模式中的裝飾類和建造者模式中建造者類的一個個函式都是為被裝飾物件附加函式額外功能或為物件中的屬性賦值。
不同點:建造者給物件添磚加瓦的順序是固定的,在Director類中寫好的;
而裝飾模式中需要新增哪些操作是由客戶端決定的。
建造者模式的詳細介紹請移步至:http://blog.csdn.net/u010425776/article/details/48104143
裝飾模式的優點
裝飾模式是為已有的功能動態新增更多功能的一種方式。
以往在設計程式的過程中,當系統需要新功能時,就在舊的類中新增新的程式碼。
但這種方式的問題在於,如果它們在類中添加了新的方法、新的欄位、新的邏輯,就會增加主類的複雜度,而這些新加入的東西僅僅是為了滿足一些只在某種特定情況下才回執行的特殊行為的需要。
而裝飾模式提供了一種非常好的解決方案,
它把每一個要額外新增的功能單獨封裝在一個個類中,並讓這個類包裝它所要裝飾的物件。
因此,當一個類需要執行特殊行為時,客戶端就可以在執行時有選擇地新增所需要的附加功能。