夢幻之旅

          DEBUG - 天道酬勤

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

          例子
          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.抽象對象實(shí)現(xiàn)
          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:[構(gòu)造方法]</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.細(xì)化抽象
          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.細(xì)化抽象實(shí)例
          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模式使用“對象間的組合關(guān)系”解耦了抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系,使得抽象和實(shí)現(xiàn)可以沿著各自的維度來變化。

          2.所謂抽象和實(shí)現(xiàn)沿著各自維度的變化,即“子類化”它們,得到各個(gè)子類之后,便可以任意它們,從而獲得不同平臺(tái)上的不同型號。

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

          4.Bridge模式的應(yīng)用一般在“兩個(gè)非常強(qiáng)的變化維度”,有時(shí)候即使有兩個(gè)變化的維度,但是某個(gè)方向的變化維度并不劇烈——換言之兩個(gè)變化不會(huì)導(dǎo)致縱橫交錯(cuò)的結(jié)果,并不一定要使用Bridge模式。


          適用性:

          1.如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的聯(lián)系。

          2.設(shè)計(jì)要求實(shí)現(xiàn)化角色的任何改變不應(yīng)當(dāng)影響客戶端,或者說實(shí)現(xiàn)化角色的改變對客戶端是完全透明的。

          3.一個(gè)構(gòu)件有多于一個(gè)的抽象化角色和實(shí)現(xiàn)化角色,系統(tǒng)需要它們之間進(jìn)行動(dòng)態(tài)耦合。

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


          總結(jié)
          Bridge模式是一個(gè)非常有用的模式,也非常復(fù)雜,它很好的符合了開放-封閉原則和優(yōu)先使用對象,而不是繼承這兩個(gè)面向?qū)ο笤瓌t。
          posted on 2011-08-03 15:26 HUIKK 閱讀(287) 評論(0)  編輯  收藏 所屬分類: Design Patterns
          主站蜘蛛池模板: 罗城| 宜川县| 岳阳市| 杂多县| 化州市| 龙岩市| 德保县| 仁寿县| 太保市| 阿拉善盟| 城口县| 海兴县| 金沙县| 水富县| 习水县| 揭东县| 台山市| 祁门县| 寿宁县| 铅山县| 忻州市| 洛浦县| 株洲市| 滨州市| 濉溪县| 澄城县| 宜昌市| 浙江省| 隆化县| 大理市| 蛟河市| 长寿区| 涟水县| 汉寿县| 高台县| 客服| 阜平县| 开化县| 新野县| 平昌县| 钦州市|