<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    夢幻之旅

    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 閱讀(282) 評論(0)  編輯  收藏 所屬分類: Design Patterns
    主站蜘蛛池模板: 中文字幕视频免费在线观看| 在线观看国产区亚洲一区成人| 福利免费在线观看| 亚洲色大18成人网站WWW在线播放| 亚洲成a人片在线观看无码| 亚洲国产精品毛片av不卡在线 | 亚洲精品在线播放视频| 亚洲精品无码国产| 亚洲国产成人久久综合区| 成人毛片免费观看视频在线| 日本免费一区二区三区四区五六区| 特级毛片全部免费播放| 亚洲欧美日韩中文无线码| 亚洲午夜精品在线| 日本亚洲视频在线 | 亚洲国产精品99久久久久久| 亚洲国产理论片在线播放| 亚洲成AV人片在WWW色猫咪| 国产亚洲精品无码拍拍拍色欲| 国产伦一区二区三区免费| 成人免费看片又大又黄| 久久不见久久见中文字幕免费| 亚洲免费网站在线观看| 精品一区二区三区免费毛片爱 | 亚洲AV福利天堂一区二区三| 亚洲国产精品一区二区成人片国内| 国产亚洲精品看片在线观看| 奇米影视亚洲春色| 亚洲午夜久久久影院| 国产精品亚洲综合专区片高清久久久| 免费大片黄手机在线观看| 亚洲av无码国产精品色在线看不卡 | 一级一级一片免费高清| 免费人成在线观看播放a| 免费无遮挡无码视频在线观看| 鲁啊鲁在线视频免费播放| 三年片在线观看免费观看大全中国| 特级毛片爽www免费版| 国产成人精品免费大全| 中文字幕一区二区免费| 久久久久久一品道精品免费看|