第39章

時間:12月21日地點:大B房間人物:大B,校

大B:“師弟,你小的時候玩過蠟筆畫畫嗎?”

小A:“有啊!小時候經常都有玩哩。怎麽啦?”

大B:“記得那紅紅綠綠的蠟筆一大盒特別漂亮。”

小A:“嗯。特漂亮!”

大B:“我們那時經常用蠟筆根據想象描繪出格式圖樣。”

小A:“對啊!特有成就感。還可以用毛筆畫國畫哩!”

大B:“就是!毛筆下的國畫更是工筆寫意,各展風采。”

小A:“是啊!小時候覺得特好玩。”

大B:“嘿嘿!對啊!那今天我們就從蠟筆與毛筆說起吧。”

小A:“好啊!”

大B:“設想要繪製一幅圖畫,藍天、白雲、綠樹、小鳥,如果畫麵尺寸很大,那麽用蠟筆繪製就會遇到點麻煩。 畢竟細細的蠟筆要塗出一片藍天,是有些麻煩。如果有可能,最好有套大號蠟筆,粗粗的蠟筆很快能塗抹完成。至於色彩嘛,最好每種顏色來支粗的,除了藍天還有綠地呢!”

小A:“那得要好多蠟筆哩!”

大B:“是啊!這樣,如果一套12種顏色的蠟筆,我們需要兩套24支,同種顏色的一粗一細。”

小A:“嗬嗬!畫還沒畫,開始做夢了:要是再有一套中號蠟筆就更好了,這樣,不多不少總共36支蠟筆。”

大B:“那當然好。再看看毛筆這一邊,居然如此簡陋:一套水彩12色,外加大中小三支毛筆。你可別小瞧這‘簡陋’的組合,畫藍天用大毛筆,畫小鳥用小毛筆,各具特色。”

小A:“嗬嗬!我好像已經看出你今天想要說的模式了。”

大B:“不錯!我今天要說的就是Bridge模式。”

小A:“還真被我看出來了哩!”

大B:“為了一幅畫,我們需要準備36支型號不同的蠟筆,而改用毛筆三支就夠了,當然還要搭配上12種顏料。通過Bridge模式,我們把乘法運算3×12=36改為了加法運算3+12=15,這一改進可不校”

小A:“那麽我們這裏蠟筆和毛筆到底有什麽區別呢?”

大B:“實際上,蠟筆和毛筆的關鍵一個區別就在於筆和顏色是否能夠分離。橋梁模式的用意是‘將抽象化(Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化’。關鍵就在於能否脫耦。蠟筆的顏色和蠟筆本身是分不開的,所以就造成必須使用36支色彩、大小各異的蠟筆來繪製圖畫。而毛筆與顏料能夠很好的脫耦,各自獨立變化,便簡化了操作。在這裏,抽象層麵的概念是:‘毛筆用顏料作畫’,而在實現時,毛筆有大中小三號,顏料有紅綠藍等12種,於是便可出現3×12種組合。每個參與者(毛筆與顏料)都可以在自己的自由度上隨意轉換。蠟筆由於無法將筆與顏色分離,造成筆與顏色兩個自由度無法單獨變化,使得隻有創建36種對象才能完成任務。Bridge模式將繼承關係轉換為組合關係,從而降低了係統間的耦合,減少了代碼編寫量。但這僅僅是Bridge模式帶來的眾多好處的一部分,更多層麵的內容。”

小A:“那用代碼怎麽去表示啊?”

大B:“我寫給你看一下,你應該就可以明白了。”

代碼:

usingSystem;

abstractclassBrush

{protectedColorc;

publicabstractvoidPaint();

publicvoidSetColor(Colorc)

{this.c=c;}

}

classBigBrush:Brush

{publicoverridevoidPaint()

{Console.WriteLine(“Usingbigbrushandcolor{0}painting”,c.color);}

}

classSmallBrush:Brush

{publicoverridevoidPaint()

{Console.WriteLine(“Usingsmallbrushandcolor{0}painting”,c.color);}

}

classColor

{publicstringcolor;

}

classRed:Color

{publicRed()

{this.color=“red”;}

}

classBlue:Color

{publicBlue()

{this.color=“blue”;}

}

classGreen:Color

{publicGreen()

{this.color=“green”;}

}

classClient

{publicstaticvoidMain()

{Brushb=newBigBrush();

b.SetColor(newRed());

b.Paint();

b.SetColor(newBlue());

b.Paint();

b.SetColor(newGreen());

b.Paint();

b=newSmallBrush();

b.SetColor(newRed());

b.Paint();

b.SetColor(newBlue());

b.Paint();

b.SetColor(newGreen());

b.Paint();

}

}