夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          橋接模式
              將抽象部份與它的實現部份分離,使它們都可獨立地變化。
              橋接模式是最復雜的模式之一,它把事物對象和其具體行為、具體特征分離開來,使它們可以各自獨立的變化。事物對象僅是一個抽象的概念。如“圓形”、“三角形”歸于抽象的“形狀”之下,而“畫圓”、“畫三角”歸于實現行為的“畫圖”類之下,然后由“形狀”調用“畫圖”。
          橋接模式的組成部份:
             1.抽象對象
             2.對象實現
             3.細化抽象
             4.細化對象實現
          橋接模式各組成部份之間的關系:

          例子
          1.抽象對象
          package bridge;

          /**
           * <ul>
           * <li>Title:[Shape]</li>
           * <li>Description: [圖形接口]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-8-3]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
           * 
          @version 1.0
           
          */

          public interface Shape
          {
              
          /**
               * <ul>
               * <li>Description:[畫法]</li>
               * <li>Created by [Huyvanpull] [2011-8-3]</li>
               * <li>Midified by [modifier] [modified time]</li>
               * </ul>
               
          */

              
          public void draw();
              
              
          /**
               * <ul>
               * <li>Description:[百分比放縮]</li>
               * <li>Created by [Huyvanpull] [2011-8-3]</li>
               * <li>Midified by [modifier] [modified time]</li>
               * </ul>
               * 
               * 
          @param pct
               
          */

              
          public void resizeByPercentage(double pct);
          }


          2.抽象對象實現
          package bridge;

          /**
           * <ul>
           * <li>Title:[CircleShape]</li>
           * <li>Description: [圓圖形]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-8-3]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
           * 
          @version 1.0
           
          */

          public class CircleShape implements Shape
          {
              
          /** 圖形位置X */
              
          private double x;
              
              
          /** 圖形位置Y */
              
          private double y;
              
              
          /** 圖形單徑 */
              
          private double radius;
              
              
          /** 畫接口 */
              
          private DrawAPI drawAPI;
              
              
          /**
               * <ul>
               * <li>Description:[構造方法]</li>
               * <ul>
               * 
               * 
          @param x
               * 
          @param y
               * 
          @param radius
               * 
          @param drawAPI
               
          */

              
          public CircleShape(double x, double y, double radius, DrawAPI drawAPI)
              
          {
                  
          this.x = x;
                  
          this.y = y;
                  
          this.radius = radius;
                  
          this.drawAPI = drawAPI;
              }

              
              
          /**
               * <ul>
               * <li>Description:[畫圖]</li>
               * <li>Created by [Huyvanpull] [2011-8-3]</li>
               * <li>Midified by [modifier] [modified time]</li>
               * </ul>
               
          */

              
          public void draw()
              
          {
                  drawAPI.drawCircle(x, y, radius);
              }

              
              
          /**
               * <ul>
               * <li>Description:[百分比放縮]</li>
               * <li>Created by [Huyvanpull] [2011-8-3]</li>
               * <li>Midified by [modifier] [modified time]</li>
               * </ul>
               * 
               * 
          @param pct
               
          */

              
          public void resizeByPercentage(double pct)
              
          {
                  radius 
          *= pct;
              }

          }


          3.細化抽象
          package bridge;

          /**
           * <ul>
           * <li>Title:[DrawAPI]</li>
           * <li>Description: [畫圖API]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-8-3]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
          @version 1.0  
           
          */

          public interface DrawAPI
          {   
              
          /**
               * <ul>
               * <li>Description:[畫圓]</li>
               * <li>Created by [Huyvanpull] [2011-8-3]</li>
               * <li>Midified by [modifier] [modified time]</li>
               * </ul>
               * 
          @param x
               * 
          @param y
               * 
          @param radius
               
          */

              
          public void drawCircle(double x, double y, double radius);
          }


          4.細化抽象實例
          1).
          package bridge;

          /**
           * <ul>
           * <li>Title:[ConcretDrawA]</li>
           * <li>Description: [具體畫法]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-8-3]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
          @version 1.0  
           
          */

          public class ConcretDrawA implements DrawAPI
          {
              
          /* (non-Javadoc)
               * @see bridge.DrawAPI#drawCircle(double, double, double)
               
          */

              
          public void drawCircle(double x, double y, double radius)
              
          {
                  System.out.printf(
          "API1.circle at %f:%f radius %f\n", x, y, radius);
              }
             
          }


          2).
          package bridge;

          /**
           * <ul>
           * <li>Title:[ConcretDrawB]</li>
           * <li>Description: [具體畫法2]</li>
           * <li>Copyright 2009 Upengs Co., Ltd.</li>
           * <li>All right reserved.</li>
           * <li>Created by [Huyvanpull] [2011-8-3]</li>
           * <li>Midified by [modifier] [modified time]</li>
           * </ul>
           * 
          @version 1.0  
           
          */

          public class ConcretDrawB implements DrawAPI
          {   
              
          /* (non-Javadoc)
               * @see bridge.DrawAPI#drawCircle(double, double, double)
               
          */

              
          public void drawCircle(double x, double y, double radius)
              
          {
                  System.out.printf(
          "API2.circle at %f:%f radius %f\n", x, y, radius);
              }
             
          }


          5.測試
          package bridge;

          public class Test
          {   
              
          public static void main(String[] args)
              
          {
                  Shape[] shapes 
          = new Shape[2];
                  shapes[
          0= new CircleShape(123new ConcretDrawA());
                  shapes[
          1= new CircleShape(5711new ConcretDrawB());
            
                  
          for (Shape shape : shapes)
                  
          {
                      shape.resizeByPercentage(
          2.5);
                      shape.draw();
                  }

              }

          }

          效果:

          1.Bridge模式使用“對象間的組合關系”解耦了抽象和實現之間固有的綁定關系,使得抽象和實現可以沿著各自的維度來變化。

          2.所謂抽象和實現沿著各自維度的變化,即“子類化”它們,得到各個子類之后,便可以任意它們,從而獲得不同平臺上的不同型號。

          3.Bridge模式有時候類似于多繼承方案,但是多繼承方案往往違背了類的單一職責原則(即一個類只有一個變化的原因),復用性比較差。Bridge模式是比多繼承方案更好的解決方法。

          4.Bridge模式的應用一般在“兩個非常強的變化維度”,有時候即使有兩個變化的維度,但是某個方向的變化維度并不劇烈——換言之兩個變化不會導致縱橫交錯的結果,并不一定要使用Bridge模式。


          適用性:

          1.如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的聯系。

          2.設計要求實現化角色的任何改變不應當影響客戶端,或者說實現化角色的改變對客戶端是完全透明的。

          3.一個構件有多于一個的抽象化角色和實現化角色,系統需要它們之間進行動態耦合。

          4.雖然在系統中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。


          總結
          Bridge模式是一個非常有用的模式,也非常復雜,它很好的符合了開放-封閉原則和優先使用對象,而不是繼承這兩個面向對象原則。
          posted on 2011-08-03 15:26 HUIKK 閱讀(287) 評論(0)  編輯  收藏 所屬分類: Design Patterns
          主站蜘蛛池模板: 绥芬河市| 霍林郭勒市| 西畴县| 双柏县| 英山县| 金乡县| 通城县| 长葛市| 罗定市| 高要市| 响水县| 巨鹿县| 名山县| 肥西县| 周至县| 武宣县| 宜兰县| 嫩江县| 璧山县| 江城| 昆山市| 武义县| 昌都县| 兰坪| 东丰县| 北宁市| 建平县| 徐水县| 赣州市| 荥阳市| 奈曼旗| 乌兰浩特市| 襄城县| 凌源市| 依兰县| 泽普县| 衡山县| 万安县| 久治县| 开封市| 宜君县|