一、定義
裝飾(Decorator)模式的定義:指在不改變現有對象結構的情況下,動態地給該對象增加一些職責(即增加其額外功能)的模式,它屬於對象結構型模式。
二、優缺點
優點:
- 採用裝飾模式擴展對象的功能比採用繼承方式更加靈活。
- 可以設計出多個不同的具體裝飾類,創造出多個不同行爲的組合。
缺點:
- 裝飾模式增加了許多子類,如果過度使用會使程序變得很複雜。
三、代碼實現舉例
(1)創建一個接口
public interface Component {
public void operation();
}
(2)創建實現接口的實體類
public class F_Component implements Component {
@Override
public void operation() {
System.out.println("This is F_Component!!!");
}
}
public class S_Component implements Component {
@Override
public void operation() {
System.out.println("This is S_Component!!!");
}
}
(3)創建實現了 Component 接口的抽象裝飾類
public abstract class ComponentDecorator implements Component {
protected Component component;
public ComponentDecorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
(4)創建擴展了 ComponentDecorator 類的實體裝飾類
public class OneComponentDecorator extends ComponentDecorator {
public OneComponentDecorator(Component component) {
super(component);
}
@Override
public void operation() {
component.operation();
setOne(component);
}
private void setOne(Component component){
System.out.println("This is OneComponentDecorator!!! ");
}
}
(5)使用 OneComponentDecorator 來裝飾 Component對象。
public class DecortorTest {
public static void main(String[] args) {
F_Component f_component = new F_Component();
ComponentDecorator f_cd = new OneComponentDecorator(new F_Component());
ComponentDecorator s_cd = new OneComponentDecorator(new S_Component());
System.out.println("--- F_Component -----");
f_component.operation();
System.out.println("--- f_cd -----");
f_cd.operation();
System.out.println("--- s_cd -----");
s_cd.operation();
}
}
輸出:
--- F_Component -----
This is F_Component!!!
--- f_cd -----
This is F_Component!!!
This is OneComponentDecorator!!!
--- s_cd -----
This is S_Component!!!
This is OneComponentDecorator!!!
四、總結
裝飾模式主要包含以下角色。
- 抽象構件(Component)角色:定義一個抽象接口以規範準備接收附加責任的對象。
- 具體構件(Concrete Component)角色:實現抽象構件,通過裝飾角色爲其添加一些職責。
- 抽象裝飾(Decorator)角色:繼承抽象構件,幷包含具體構件的實例,可以通過其子類擴展具體構件的功能。
- 具體裝飾(ConcreteDecorator)角色:實現抽象裝飾的相關方法,並給具體構件對象添加附加的責任。