天天看點

HeadFirst筆記03:裝飾者模式裝飾者模式是什麼?實際簡單例子的代碼:

裝飾者模式是什麼?

裝飾者模式顧名思義就是裝飾被裝飾者的模式,比如裝飾聖誕樹。

舉例:暖暖系列的換裝遊戲

暖暖要換裝,要挂很多東西,而暖暖有不同打扮然後進行打扮評分,如果正常來講要建立很多物品類,也就是由暖暖來調用很多個物品類加人上。這樣太過麻煩,就相當于把所有的裝扮都扔在一起讓暖暖挑。而打扮評分也得一個一個調用加上去。

但裝飾者模式就不一樣,它更傾向于組合而不是繼承。但它比較重要的一點就是裝飾者都有一個共同的超類,這樣才能使裝飾者覆寫被裝飾者,達到裝飾的目的。簡單來說相當于自定義套裝形式出現。

這樣的好處在于:

裝飾類和被裝飾類不互相耦合,可各自獨立發展,可動态擴充。

實際簡單例子的代碼:

結構示意圖:

HeadFirst筆記03:裝飾者模式裝飾者模式是什麼?實際簡單例子的代碼:

1.首先的建立源類,注意抽象abstract

//一切的基礎裝扮源
public abstract class attire {
    String description="未知裝扮";
    //裝扮描述
    public String getDescription(){
        return description;
    }
    //裝扮分數
    public abstract int score();
}
           

 2.建立第一層裝扮-衣服

//衣服-紅色長裙
public class redlonguette extends attire {
    public redlonguette(){
        description="紅色長裙";
    }
    @Override
    public int score() {
        return 50;
    }
}
           

3.建立第二層裝扮-化妝 

//化妝
public abstract class makeup extends attire {
    public abstract String getDescription();
}
//腮紅
public class makeup_rouge extends makeup {
    //被裝飾者
    attire attire;

    //将繼承的被裝飾者對象指派給目前的被裝飾者
    public makeup_rouge(attire attire){
        this.attire=attire;
    }

    @Override
    public String getDescription() {
        return attire.getDescription() + "+腮紅";
    }

    @Override
    public int score() {
        return 5+attire.score();
    }
}
//白色眉毛
public class makeup_whiteEyebrow extends makeup {
    //被裝飾者
    attire attire;

    //将繼承的被裝飾者對象指派給目前的被裝飾者
    public makeup_whiteEyebrow(attire attire){
        this.attire=attire;
    }

    @Override
    public String getDescription() {
        return attire.getDescription() + "+白色眉毛";
    }

    @Override
    public int score() {
        return 11+attire.score();
    }
}
           

4.實際調用測試

//裝飾者模式
public class DecoratorPattern {
    public static void main(String[] args) {
          //不添加化妝,隻衣服
          attire attireTest=new redlonguette();
          System.out.println("不添加化妝,隻用衣服");
          System.out.println("描述:"+attireTest.getDescription());
          System.out.println("分數:"+attireTest.score()+"分");


          //衣服+化妝
          attire attireTest2=new redlonguette();
          attireTest2 = new makeup_whiteEyebrow(attireTest2);
          attireTest2 = new makeup_rouge(attireTest2);
          System.out.println("衣服基礎上添加2種化妝");
          System.out.println("描述:"+attireTest2.getDescription());
          System.out.println("分數:"+attireTest2.score()+"分");


    }
}
           

結果:

HeadFirst筆記03:裝飾者模式裝飾者模式是什麼?實際簡單例子的代碼: