1. 程式人生 > >設計模式之裝飾模式(Decorator)

設計模式之裝飾模式(Decorator)

設計模式之裝飾模式(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();
    }

類圖
在這裡插入圖片描述
適用性

  • 動態且透明地向各個物件新增職責,即不影響其他物件
  • 對於可以撤回的責任
  • 通過子類擴充套件是不切實際的。有時可能會有大量獨立擴充套件,並會產生大量子類以支援每種組合。或者類定義可能隱藏或不可用於子類化