1. 類的功能擴展
面向對象設計中, 可擴展通常是類設計中的一項重要考量. 在不改變原有類的情況下, 對當前類進行擴展的最直接方法是繼承當前類, 並在子類中擴展其功能. 然而, 如果我們對當前類的擴展並不是專屬與該類的, 例如對其他類也可能需要進行該功能的擴展, 則如果使用繼承模式, 我們需要對每一個待擴展類分別繼承, 並在子類中添加相同的擴展功能代碼. 在良好的代碼設計中, 通常應該考慮消除重複代碼. 藉助裝飾器模式, 我們可以消除在每一個待擴展類上重複編寫擴展功能代碼.
2. 裝飾器模式適用場景
對功能擴展使用類似可拔插的接口設計, 可以自由組裝多個擴展類以生成一個自定義的多功能類.
3. 代碼
public Interface Base{
public void run(){
}
}
public class Fun implements Base{
public void run(){
}
}
public class DecoratorA implements Base{
private Base base;
public DecoratorA(Base base){
this.base = base;
}
public void run(){
//擴展功能
}
}
public class DecoratorB implements Base{
private Base base;
public DecoratorB(Base base){
this.base = base;
}
public void run(){
//功能擴展
}
}
public class DecoratorC implements Base{
private Base base;
public DecoratorC(Base base){
this.base = base;
}
public void run(){
}
}
public class Main{
public void main(String[] args){
Base b = new Fun();
Base decorator = new DecoratorA(new DecoratorB(new DecoratorC(b)));
decorator.run();
}
}
4.總結
- 相對於通過繼承實現功能擴展, 裝飾器模式提供了更大的靈活性與擴展功能複用性
- 組裝不是裝飾器時應考慮不同組裝順序可能導致的最終功能差異