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

    從程序結構中可以看到,完全符合了前面我們的要求:“靈活”,“順序敏感”。
    主站蜘蛛池模板: 亚洲一卡一卡二新区无人区| 亚洲欧洲日韩在线电影| mm1313亚洲国产精品无码试看| 最近中文字幕无免费视频| 亚洲三级视频在线| 国产成人无码免费看视频软件| 亚洲国产精品yw在线观看| 久久国内免费视频| 最新亚洲精品国偷自产在线| 色播在线永久免费视频| 久久亚洲AV成人无码国产电影| 国产乱人免费视频| 五月天国产成人AV免费观看| 成人午夜亚洲精品无码网站| 久久国产免费一区| 亚洲人成网站色在线观看| 日美韩电影免费看| 美女无遮挡拍拍拍免费视频| 91亚洲自偷手机在线观看| 色播精品免费小视频| 亚洲а∨精品天堂在线| 亚洲精品无码av天堂| 嫩草在线视频www免费观看| 久久久久亚洲AV无码专区首JN| 免费阿v网站在线观看g| 国产精品亚洲专区无码牛牛| 亚洲伊人成无码综合网| 日本黄色动图免费在线观看| 亚洲伊人久久大香线蕉| 亚洲第一页日韩专区| 鲁丝片一区二区三区免费| 亚洲H在线播放在线观看H| 国产一区在线观看免费| 国内精品99亚洲免费高清| 亚洲第一二三四区| 亚洲AV无码成H人在线观看| 曰批全过程免费视频网址| 亚洲AV成人片无码网站| 亚洲国产成人一区二区精品区| 成人最新午夜免费视频| 九九热久久免费视频|