熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

設計模式-快餐簡解-【裝飾模式】

2013-11-23 19:49:50  來源: Java高級技術 

  裝飾模式應用場景舉例

  比如在玩極品飛車這款游戲游戲中有對汽車進行噴塗鴉的功能而且這個噴塗鴉是可以覆蓋的並且覆蓋的順序也影響到最後車身的顯示效果假設現在噴塗鴉具有種樣式)紅色火焰 ()紫色霞光如果使用繼承父類設計這樣的功能那麼類圖就像如下的這樣

  

  從圖中可以看到使用繼承來實現這種功能並且是種塗鴉樣式就需要創建個子類如果噴塗鴉有種呢?這種情況就是典型中學課程學習過的排列與組合那簡直就是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) {
        thismake_address = make_address;
    }
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        thisspeed = speed;
    }
    public abstract void print_face();
}

  然後新建一個奧迪汽車子類

package car_package;
public class audi_sub extends car_parent {
    // 奧迪汽車子類
    @Override
    public void print_face() {
        Systemoutprintln(audi車默認的顏色為 黑色);
    }
}

  然後再新建一個裝飾者父類

package decorator_package;
import car_packagecar_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) {
        thiscar_parent_ref = car_parent_ref;
    }
    @Override
    public void print_face() {
        car_parent_refprint_face();
    }
}

  然後再新建裝飾者子類紅色火焰裝飾者類

package decorator_package;
public class decorator_audi_red extends decorator_parent {
    @Override
    public void print_face() {
        superprint_face();
        Systemoutprintln(給 奧迪 噴塗鴉  顏色為 紅色火焰);
    }
}

  然後再新建裝飾者子類紫色霞光裝飾者類

package decorator_package;
public class decorator_audi_purple extends decorator_parent {
    @Override
    public void print_face() {
        superprint_face();
        Systemoutprintln(給 奧迪 噴塗鴉  顏色為 紫色霞光);
    }
}

  新建一個運行類

package main_run;

import car_packageaudi_sub;
import decorator_packagedecorator_audi_purple;
import decorator_packagedecorator_audi_red;

public class main_run {

    public static void main(String[] args) {

        audi_sub audi_sub_ref = new audi_sub();
        audi_sub_refsetMake_address(北京市朝陽區);
        audi_sub_refsetSpeed();

        decorator_audi_red decorator_audi_red_ref = new decorator_audi_red();
        decorator_audi_red_refsetCar_parent_ref(audi_sub_ref);

        decorator_audi_purple decorator_audi_purple_ref = new decorator_audi_purple();
        decorator_audi_purple_refsetCar_parent_ref(decorator_audi_red_ref);

        decorator_audi_purple_refprint_face();
    }
}

  程序運行結果如下

audi車默認的顏色為 黑色
給 奧迪 噴塗鴉  顏色為 紅色火焰
給 奧迪 噴塗鴉  顏色為 紫色霞光

  從程序結構中可以看到完全符合了前面我們的要求靈活順序敏感

  【裝飾模式MyEclipse項目JAVA代碼實現

  裝飾模式decorator示例代碼點擊


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27520.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.