裝飾者模式是什麼?
裝飾者模式顧名思義就是裝飾被裝飾者的模式,比如裝飾聖誕樹。
舉例:暖暖系列的換裝遊戲
暖暖要換裝,要挂很多東西,而暖暖有不同打扮然後進行打扮評分,如果正常來講要建立很多物品類,也就是由暖暖來調用很多個物品類加人上。這樣太過麻煩,就相當于把所有的裝扮都扔在一起讓暖暖挑。而打扮評分也得一個一個調用加上去。
但裝飾者模式就不一樣,它更傾向于組合而不是繼承。但它比較重要的一點就是裝飾者都有一個共同的超類,這樣才能使裝飾者覆寫被裝飾者,達到裝飾的目的。簡單來說相當于自定義套裝形式出現。
這樣的好處在于:
裝飾類和被裝飾類不互相耦合,可各自獨立發展,可動态擴充。
實際簡單例子的代碼:
結構示意圖:
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()+"分");
}
}