Posted on 2009-01-20 17:27
非洲小白臉 閱讀(230)
評論(0) 編輯 收藏 所屬分類:
模式
【
裝飾模式應用場景舉例】
比如在玩“極品飛車”這款游戲,游戲中有對汽車進行噴涂鴉的功能,而且這個噴涂鴉是可以覆蓋的,并且覆蓋的順序也影響到最后車身的顯示效果,假設現在噴涂鴉具有2種樣式:
(1)紅色火焰 (2)紫色霞光
如果使用“繼承父類”設計這樣的功能,那么類圖就像如下的這樣:

從圖中可以看到使用繼承來實現這種功能,并且是2種涂鴉樣式,就需要創建4個子類,如果噴涂鴉有3種,4種呢?這種情況就是典型中學課程學習過的“排列與組合”,那簡直就是“Head First設計模式”書中講的“類爆炸”。
顯然繼承“奧迪汽車類”的這個辦法是無效,而且是非常徒勞,繁瑣的。
那么如何才能以“靈活”,“順序敏感”這樣的需求來實現這樣的功能呢?
【
裝飾模式解釋】
類型:結構模式
動態的對一個對象進行功能上的擴展,也可以對其子類進行功能上的擴展。
【
裝飾模式UML圖】
【
裝飾模式-JAVA代碼實現】
新建一個抽象汽車父類:
package car_package;
public abstract class car_parent {
// 汽車抽象父類
private String make_address;
private int speed;
public String getMake_address() {
return make_address;
}
public void setMake_address(String make_address) {
this.make_address = make_address;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public abstract void print_face();
}
然后新建一個奧迪汽車子類:
package car_package;
public class audi_sub extends car_parent {
// 奧迪汽車子類
@Override
public void print_face() {
System.out.println("audi車默認的顏色為 黑色");
}
}
然后再新建一個裝飾者父類:
package decorator_package;
import car_package.car_parent;
public abstract class decorator_parent extends car_parent {
// 裝飾者父類
protected car_parent car_parent_ref;
public void setCar_parent_ref(car_parent car_parent_ref) {
this.car_parent_ref = car_parent_ref;
}
@Override
public void print_face() {
car_parent_ref.print_face();
}
}
然后再新建裝飾者子類:紅色火焰裝飾者類:
package decorator_package;
public class decorator_audi_red extends decorator_parent {
@Override
public void print_face() {
super.print_face();
System.out.println("給 奧迪 噴涂鴉 - 顏色為 紅色火焰");
}
}
然后再新建裝飾者子類:紫色霞光裝飾者類:
package decorator_package;
public class decorator_audi_purple extends decorator_parent {
@Override
public void print_face() {
super.print_face();
System.out.println("給 奧迪 噴涂鴉 - 顏色為 紫色霞光");
}
}
新建一個運行類:
package main_run;
import car_package.audi_sub;
import decorator_package.decorator_audi_purple;
import decorator_package.decorator_audi_red;
public class main_run {
public static void main(String[] args) {
audi_sub audi_sub_ref = new audi_sub();
audi_sub_ref.setMake_address("北京市朝陽區");
audi_sub_ref.setSpeed(200);
decorator_audi_red decorator_audi_red_ref = new decorator_audi_red();
decorator_audi_red_ref.setCar_parent_ref(audi_sub_ref);
decorator_audi_purple decorator_audi_purple_ref = new decorator_audi_purple();
decorator_audi_purple_ref.setCar_parent_ref(decorator_audi_red_ref);
decorator_audi_purple_ref.print_face();
}
}
程序運行結果如下:
audi車默認的顏色為 黑色
給 奧迪 噴涂鴉 - 顏色為 紅色火焰
給 奧迪 噴涂鴉 - 顏色為 紫色霞光
從程序結構中可以看到,完全符合了前面我們的要求:“靈活”,“順序敏感”。