Franky's LIFE

          Anything... ...

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            53 隨筆 :: 87 文章 :: 6 評論 :: 0 Trackbacks
          ? Bridge 橋接模式是一種結構型模式,它主要應對的是:由于類型的固有羅輯,使得類型具有兩個或兩個以上的緯度變化。也就是要求抽象不應依賴于實現細節,實現細節應依賴于抽象。

          ?????? 《設計模式》中說到將抽象部分與實現部分分離,使他們可以獨立的變化。

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

          ?????? 現在我們來看看 Bridge 橋接模式,看看它是如何解決類似問題的,首先我們看看 Bridge 模式的結構。


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

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

          ?????? 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();

          }

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

          class WaterRoad:AbstractRoad

          ??? {

          ??????? public override string GetRoadType()

          ??????? {

          ??????????? return "It is WaterRoad";

          ??????? }

          ?}

          class CementRoad:AbstractRoad

          ??? {

          ??????? public override string GetRoadType()

          ??????? {

          ??????????? return "It is Cement";

          ??????? }

          }

          然后再來編寫汽車的實現

          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";

          ??????? }

          ? }

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

          static void Main(string[] args)

          ??????? {

          ??????????? AbstractCar car = newBMWCar(newWaterRoad());

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

          ??????????? Console.WriteLine(car.Run());

          ??????????? Console.WriteLine(car.Stop());

          ??????????? Console.Read();

          ??????? }

          實現結果如下:

          It is WaterRoad

          BMW is running

          BMW is stopped

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

          static void Main(string[] args)

          ??????? {

          ??????????? AbstractCar car = newBROACar(newCementRoad());

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

          ??????????? Console.WriteLine(car.Run());

          ??????????? Console.WriteLine(car.Stop());

          ??????????? Console.Read();

          ???? }

          實現結果如下:

          It is Cement

          BROA is running

          BROA is stopped

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

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

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

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

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

          posted on 2007-03-19 20:53 Franky 閱讀(155) 評論(0)  編輯  收藏 所屬分類: IT知識
          主站蜘蛛池模板: 泰宁县| 舒城县| 浏阳市| 藁城市| 惠来县| 乌鲁木齐县| 蚌埠市| 酒泉市| 兰坪| 石嘴山市| 呼图壁县| 军事| 新河县| 彰化县| 长治市| 互助| 文昌市| 涡阳县| 肃宁县| 甘孜县| 平江县| 手机| 云阳县| 尚志市| 陆良县| 托克托县| 达日县| 于都县| 湖南省| 中宁县| 盘山县| 万年县| 岳池县| 博野县| 锡林浩特市| 谷城县| 平凉市| 迁西县| 浮山县| 中西区| 石渠县|