爪哇一角

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

          從程序結構中可以看到,完全符合了前面我們的要求:“靈活”,“順序敏感”。
          主站蜘蛛池模板: 富顺县| 美姑县| 栾城县| 鹤峰县| 青冈县| 房产| 揭西县| 赤城县| 安吉县| 乐至县| 新竹市| 天气| 尚志市| 秦皇岛市| 托克托县| 齐河县| 江都市| 江华| 两当县| 嘉黎县| 舞钢市| 霍邱县| 西青区| 双峰县| 鄱阳县| 乌什县| 津市市| 威宁| 瑞丽市| 尚义县| 江永县| 咸阳市| 兴和县| 蒙自县| 调兵山市| 古丈县| 香格里拉县| 浙江省| 乳山市| 咸丰县| 永修县|