裝飾者模式
定義:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)就增加功能來說,裝飾模式相比生成子類更為靈活彬向。
-
UML類圖:裝飾者模式
-
綜合分析:
優(yōu)點(diǎn):
- 裝飾者和被裝飾者相互解藕。
- 繼承的替換方案攻冷,更靈活地實(shí)現(xiàn)“繼承”特性娃胆。
- 動(dòng)態(tài)的擴(kuò)展功能類,完全符合“開閉原則”等曼。
缺點(diǎn):
- 多層裝飾里烦,會(huì)造成代碼復(fù)雜性。
適用場(chǎng)景:
- 擴(kuò)展一個(gè)類的功能禁谦。
- 功能的多變性胁黑,隨時(shí)動(dòng)態(tài)增加功能。
- 為一批兄弟類進(jìn)行改裝州泊,首選裝飾者模式丧蘸。
總結(jié):裝飾者模式的關(guān)鍵在于Component的operate()方法,整個(gè)模式都是以該方法展開裝飾拥诡。思想需要大家去琢磨和體會(huì)触趴,加油氮发!
裝飾者模式實(shí)踐
組建抽象類
public abstract class Component{
public abstract void operate();
}
被裝飾類
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("I am a Component!");
}
}
裝飾類組
public abstract class AbstractDecorator extends Component {
public Component component = null;
public AbstractDecorator(Component c) {
component = c;
}
@Override
public abstract void operate();
}
public class ConcreteDecoratorA extends AbstractDecorator {
public ConcreteDecoratorA(Component c) {
super(c);
}
@Override
public void operate() {
component.operate();
System.out.println("Add DecoratorA");
}
}
public class ConcreteDecoratorB extends AbstractDecorator {
public ConcreteDecoratorB(Component c) {
super(c);
}
@Override
public void operate() {
System.out.println("Add DecoratorB");
component.operate();
}
}
客戶端類
public class client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
component = new ConcreteDecoratorA(component);
component.operate();
component = new ConcreteDecoratorB(component);
component.operate();
}
}