爪哇一角

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

          裝飾模式

          Posted on 2009-01-20 17:27 非洲小白臉 閱讀(233) 評論(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車默認的顏色為 黑色
          給 奧迪 噴涂鴉 
          - 顏色為 紅色火焰
          給 奧迪 噴涂鴉 
          - 顏色為 紫色霞光

          從程序結構中可以看到,完全符合了前面我們的要求:“靈活”,“順序敏感”。
          主站蜘蛛池模板: 昌宁县| 枣阳市| 德令哈市| 穆棱市| 瑞安市| 罗甸县| 万荣县| 曲靖市| 洛南县| 涿鹿县| 铁岭县| 新郑市| 江川县| 辉县市| 屯昌县| 沈丘县| 嘉禾县| 云梦县| 西乌珠穆沁旗| 泸溪县| 宁城县| 台中县| 资阳市| 永丰县| 裕民县| 兴安县| 广饶县| 九龙城区| 巫山县| 乌兰察布市| 玛纳斯县| 庆元县| 霍林郭勒市| 大庆市| 富顺县| 剑阁县| 平昌县| 隆昌县| 临泽县| 东乡| 元氏县|