日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式

 skywood 2007-08-06

       Bridge橋接模式是一種結(jié)構(gòu)型模式,它主要應(yīng)對的是:由于類型的固有羅輯,使得類型具有兩個或兩個以上的緯度變化。也就是要求抽象不應(yīng)依賴于實現(xiàn)細節(jié),實現(xiàn)細節(jié)應(yīng)依賴于抽象。

       《設(shè)計模式》中說到將抽象部分與實現(xiàn)部分分離,使他們可以獨立的變化。

       舉個例子更清楚些,好像我們平時玩的游戲中有PS版的,但是不是大家都有PS。這時我們等一段時間,一般會出PC版的或其他版本。由于支持游戲的平臺不一樣,但是如果我們編寫的游戲程序為了適應(yīng)另一種平臺就要全部重新編寫的話豈不是很麻煩。再加上游戲本身的變動,一句眾人皆知的話:“死定了。

       現(xiàn)在我們來看看Bridge橋接模式,看看它是如何解決類似問題的,首先我們看看Bridge模式的結(jié)構(gòu)。


      
實際上,我們要做到的是把變化的部分提出,對其抽象,使變化獨立。那我們?nèi)绾巫瞿??通過組合的方式將變化獨立出去。將一個事物中的多個緯度變化分離。

       下面舉一個場景來理解一下,還是用汽車舉例,我現(xiàn)在要一輛車(BMWBORA)在路(WaterRoadCement)上跑?,F(xiàn)在有兩個緯度的變化點:汽車和路。也就是上圖中的AbstractChangePoint1AbstractChangePoint2。AbstractChangePoint1中包含有AbstractChangePoint2對象成員。。代碼實現(xiàn)如下:

       abstract class AbstractCar

    {

        public AbstractRoad road;

 

        public AbstractCar(AbstractRoad road)

        {

            this.road = road;

        }

 

        public abstract string Run();

        public abstract string Stop();

    }

 

    abstract class AbstractRoad

    {

        public abstract string GetRoadType();

}

以汽車為變化中心,用組裝的方式將兩個變化點結(jié)合起來。使路的變化和汽車隔離。下面來編寫路的實現(xiàn)。

class WaterRoad:AbstractRoad

    {

        public override string GetRoadType()

        {

            return "It is WaterRoad";

        }

 }

class CementRoad:AbstractRoad

    {

        public override string GetRoadType()

        {

            return "It is Cement";

        }

}

然后再來編寫汽車的實現(xiàn)

class BMWCar:AbstractCar

    {

        public BMWCar(AbstractRoad road)

            : base(road)

        {

          

        }

 

        public override string Run()

        {

            return "BMW is running";

        }

 

        public override string Stop()

        {

            return "BMW is stopped";

        }

 }

class BROACar:AbstractCar

    {

        public BROACar(AbstractRoad road)

            : base(road)

        {

           

        }

 

        public override string Run()

        {

            return "BROA is running";

        }

 

        public override string Stop()

        {

            return "BROA is stopped";

        }

  }

然后我們在客戶代碼中調(diào)用這些類,首先,我想要這個場景是BMWWaterRoad上跑,客戶端代碼如下:

static void Main(string[] args)

        {

            AbstractCar car = new BMWCar(new WaterRoad());

            Console.WriteLine(car.road.GetRoadType());

            Console.WriteLine(car.Run());

            Console.WriteLine(car.Stop());

            Console.Read();

        }

實現(xiàn)結(jié)果如下:

It is WaterRoad

BMW is running

BMW is stopped

如果我現(xiàn)在要一輛BORACement上跑,我們只要稍微修改一下car的實例化就可以,代碼如下:

static void Main(string[] args)

        {

            AbstractCar car = new BROACar(new CementRoad());

            Console.WriteLine(car.road.GetRoadType());

            Console.WriteLine(car.Run());

            Console.WriteLine(car.Stop());

            Console.Read();

     }

實現(xiàn)結(jié)果如下:

It is Cement

BROA is running

BROA is stopped

       最后我們再來說說Bridge模式的要點:

       1、Bridge模式使用“對象間的組合關(guān)系”解耦了抽象和實現(xiàn)之間固有的綁定關(guān)系,使得抽象和實現(xiàn)可以沿著各自的緯度來變化。

2、所謂抽象和實現(xiàn)沿著各自緯度的變化,即“子類化”它們,得到各個子類之后,便可以任意組合它們。

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

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

posted on 2006-05-31 09:02 KiddLee 閱讀(1516) 評論(10)  編輯 收藏 引用 網(wǎng)摘 所屬分類: 設(shè)計模式

FeedBack:
# 
中午和TerryList一起吃飯,他提示我抽象類應(yīng)用斜體字。哈哈,不好意思,剛開始用UML圖表示,在畫的時候有很多不注意的地方,還望大家多多指教。  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-05-31 16:14 TerryLee
@kid_li

大哥,我叫TerryLee,不是TerryList:-)  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-05-31 17:40 kid_li
@TerryLee
不好意思,不小心寫錯了  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-06-01 11:31 公木子
花了一個上午的時間全部看完了你寫的八種模式設(shè)計,寫得不錯。如果你能把23種都寫完的話,希望你能寫個總結(jié)就想下面的一樣,很容易混淆的
Singleton單件模式解決的問題是:實體對象個數(shù)問題(這個現(xiàn)在還不太容易混)

AbstractFactory抽象工廠模式解決的問題是:“一系列互相依賴的對象”的創(chuàng)建工作

Builder生成器模式解決的問題是:“一些復(fù)雜對象”的創(chuàng)建工作,子對象變化較頻繁,對算法相對穩(wěn)定

FactoryMethor工廠方法模式解決的問題是:某個對象的創(chuàng)建工作

  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-06-01 11:31 公木子
花了一個上午的時間全部看完了你寫的八種模式設(shè)計,寫得不錯。如果你能把23種都寫完的話,希望你能寫個總結(jié)就想下面的一樣,很容易混淆的
Singleton單件模式解決的問題是:實體對象個數(shù)問題(這個現(xiàn)在還不太容易混)

AbstractFactory抽象工廠模式解決的問題是:“一系列互相依賴的對象”的創(chuàng)建工作

Builder生成器模式解決的問題是:“一些復(fù)雜對象”的創(chuàng)建工作,子對象變化較頻繁,對算法相對穩(wěn)定

FactoryMethor工廠方法模式解決的問題是:某個對象的創(chuàng)建工作

  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-06-01 11:31 公木子
花了一個上午的時間全部看完了你寫的八種模式設(shè)計,寫得不錯。如果你能把23種都寫完的話,希望你能寫個總結(jié)就想下面的一樣,很容易混淆的
Singleton單件模式解決的問題是:實體對象個數(shù)問題(這個現(xiàn)在還不太容易混)

AbstractFactory抽象工廠模式解決的問題是:“一系列互相依賴的對象”的創(chuàng)建工作

Builder生成器模式解決的問題是:“一些復(fù)雜對象”的創(chuàng)建工作,子對象變化較頻繁,對算法相對穩(wěn)定

FactoryMethor工廠方法模式解決的問題是:某個對象的創(chuàng)建工作

  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-06-01 11:31 公木子
花了一個上午的時間全部看完了你寫的八種模式設(shè)計,寫得不錯。如果你能把23種都寫完的話,希望你能寫個總結(jié)就想下面的一樣,很容易混淆的
Singleton單件模式解決的問題是:實體對象個數(shù)問題(這個現(xiàn)在還不太容易混)

AbstractFactory抽象工廠模式解決的問題是:“一系列互相依賴的對象”的創(chuàng)建工作

Builder生成器模式解決的問題是:“一些復(fù)雜對象”的創(chuàng)建工作,子對象變化較頻繁,對算法相對穩(wěn)定

FactoryMethor工廠方法模式解決的問題是:某個對象的創(chuàng)建工作

  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-06-01 11:54 kid_li
@公木子
哈哈,謝謝你的支持,沒問題,我會的  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-07-11 15:34 大雁
寫 得不錯,例子也好,比板橋里人寫得好。最后的總結(jié)很經(jīng)典,支持。只是AbstractChangPoint2與AbstractChangPoint1之 間是不是應(yīng)該用聚集的符號?另外,ClientApp放在這沒必要吧。僅供參考,呵呵,我寫了這個例子的UML圖,可惜貼不上...  回復(fù)  更多評論
  
# re: 設(shè)計模式學(xué)習(xí)筆記(八)——Bridge橋接模式 2006-07-11 20:34 kid_li
@大雁
我不是很會畫UML圖,可不可以畫一張用Email(kid_li@126.com)發(fā)給我給我學(xué)習(xí)一下。謝謝了  回復(fù)  更多評論

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多