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

}

}

第79章第134章第215章第177章第76章第1章第74章第190章第111章第147章第148章第14章第76章第149章第189章第19章第217章第13章第90章第96章第148章第8章第193章第192章第80章第224章第196章第143章第152章第107章第44章第224章第28章第87章第211章第72章第215章第89章第171章第225章第159章第28章第73章第97章第168章第12章第132章第3章第66章第30章第148章第23章第171章第205章第88章第224章第109章第140章第122章第65章第206章第24章第43章第154章第206章第77章第127章第189章第121章第123章第190章第186章第32章第57章第58章第30章第121章第164章第119章第13章第84章第162章第225章第44章第206章第172章第130章第220章第174章第201章第94章第159章第189章第207章第8章第99章第123章第101章第19章第123章
第79章第134章第215章第177章第76章第1章第74章第190章第111章第147章第148章第14章第76章第149章第189章第19章第217章第13章第90章第96章第148章第8章第193章第192章第80章第224章第196章第143章第152章第107章第44章第224章第28章第87章第211章第72章第215章第89章第171章第225章第159章第28章第73章第97章第168章第12章第132章第3章第66章第30章第148章第23章第171章第205章第88章第224章第109章第140章第122章第65章第206章第24章第43章第154章第206章第77章第127章第189章第121章第123章第190章第186章第32章第57章第58章第30章第121章第164章第119章第13章第84章第162章第225章第44章第206章第172章第130章第220章第174章第201章第94章第159章第189章第207章第8章第99章第123章第101章第19章第123章