<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    爪哇一角

    共同探討STRUTS#HIBERNATE#SPRING#EJB等技術
    posts - 3, comments - 6, trackbacks - 0, articles - 99
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    裝飾模式

    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車默認的顏色為 黑色
    給 奧迪 噴涂鴉 
    - 顏色為 紅色火焰
    給 奧迪 噴涂鴉 
    - 顏色為 紫色霞光

    從程序結構中可以看到,完全符合了前面我們的要求:“靈活”,“順序敏感”。
    主站蜘蛛池模板: 182tv免费视视频线路一二三| 2019中文字幕在线电影免费| 日韩免费在线观看| 亚洲日韩精品无码AV海量| 四虎影院在线免费播放| 亚洲自偷自偷在线成人网站传媒 | 国产曰批免费视频播放免费s| 老司机亚洲精品影院| 2019中文字幕在线电影免费| 亚洲校园春色小说| 亚洲另类自拍丝袜第五页| 成人免费视频一区二区三区| 亚洲人片在线观看天堂无码| 在线观看成人免费| 美国免费高清一级毛片| 亚洲天堂在线视频| 亚洲中文字幕久在线| 青青青国产在线观看免费网站| 亚洲三级视频在线观看| 女人让男人免费桶爽30分钟| 美女被艹免费视频| 日本一区二区三区免费高清| 亚洲精品无码久久久久秋霞| 免费v片在线观看无遮挡| 久久毛片免费看一区二区三区| 亚洲成熟xxxxx电影| 久久精品免费一区二区喷潮 | 三年片在线观看免费观看大全中国| 亚洲婷婷国产精品电影人久久| a级毛片黄免费a级毛片| 亚洲国产情侣一区二区三区| 久久永久免费人妻精品| 亚洲综合丁香婷婷六月香| 免费观看美女用震蛋喷水的视频 | 国产高清对白在线观看免费91 | 亚洲电影在线免费观看| 午夜电影免费观看| 成人电影在线免费观看| 成人亚洲国产va天堂| 亚洲综合色婷婷七月丁香| 国产在线观看免费观看不卡|