設計模式之裝飾模式(Decorator)
阿新 • • 發佈:2018-11-10
設計模式之裝飾模式(Decorator)
場景
普通人跑步,跳高,舉重很普通。
現在需要使用裝備變成鋼鐵俠,3項指標成倍擴大
Man介面
public interface Man {
void run();
int highJump();
int weightlifting();
}
normal man
public class NormalMan implements Man {
@Override
public void run() {
System.out.println( "Normal man run.");
}
@Override
public int highJump() {
System.out.println("Normal man heigh jump 1m.");
return 1;
}
@Override
public int weightlifting() {
System.out.println("Normal man weightlifting 30KG.");
return 30;
}
}
iron man
public class IronMan implements Man {
private Man normalMan;
public IronMan(Man normalMan) {
this.normalMan = normalMan;
}
@Override
public void run() {
normalMan.run();
System.out.println("upgrade iron man speed 1000m/s");
}
@Override
public int highJump () {
System.out.println("upgrade iron man highJump "+normalMan.highJump()*100+"m.");
return normalMan.highJump()*100;
}
@Override
public int weightlifting() {
System.out.println("upgrade iron man weightlifting "+normalMan.weightlifting()*100+" KG");
return normalMan.weightlifting()*100;
}
}
測試
@Test
public void decorator(){
Man normalMan = new NormalMan();
normalMan.run();
normalMan.highJump();
normalMan.weightlifting();
System.out.println("==============");
Man ironMan = new IronMan(normalMan);
ironMan.run();
ironMan.highJump();
ironMan.weightlifting();
}
類圖
適用性
- 動態且透明地向各個物件新增職責,即不影響其他物件
- 對於可以撤回的責任
- 通過子類擴充套件是不切實際的。有時可能會有大量獨立擴充套件,並會產生大量子類以支援每種組合。或者類定義可能隱藏或不可用於子類化