作者:zuoxiaolong8810(左瀟龍),轉載請注明出處,特別說明:本博文來自博主原博客,為保證新博客中博文的完整性,特復制到此留存,如需轉載請注明新博客地址即可。
魔都國貿附近,某天夜里十一點半。
那一晚,魔都出奇的沒有做只打雷不下雨的勾當,老天似乎是要將魔都淹沒一般,傾盆大雨像不要命似的拍打着地面。
漆黑的夜幕中,一道黑影從一個十字路口狂奔而出,而就在此時,一輛紅色寶馬急速穿過,一瞬間,黑影就猶如被巨力拋飛一般騰空而起,直到幾秒鍾后,才重重的摔落在車前足足二十多米處。
“吱...茲....”
一聲凄厲的剎車聲划破了魔都的長空。
之后,一個身材高挑的女子,慌忙的從車中奔跑到黑影落下的地方,或許是由於看到倒下之人滿身鮮血的模樣,女子嚇的不禁發出一聲驚叫后退了幾步,愣是咬着牙遲遲不敢上前。
或許是由於慌亂之下失了神,女子后退的時候,差點被一個物體絆倒。女子低頭一看,竟然是一只拖鞋,不知為何,看到這一幕,一時間女子的心緒穩定了不少。
待得情緒穩定以后,女子這才再次意識到自己撞到人了,而此人到現在還不知死活。於是女子急忙再次跑到黑影身旁,開始試圖叫醒這位被自己撞傷的路人,而由於此時一直是大雨傾盆,被撞之人身上的鮮血已經被沖刷干凈,女子也漸漸的看清了黑影的面貌。
此人看起來年紀不大,穿着一條大褲衩和一條普通的黑色T恤,光着兩個腳丫子,五官倒還算端正,只是滿臉的青春痘將其僅有的一點英俊全部淹沒,不過從此人光着的腳丫子就可以看出,剛才地上的拖鞋應該就是此人被撞飛的鞋子了。
久久嘗試叫醒傷者未果之后,女子無奈之下,只好使出渾身的力氣才堪堪拖動此人,等到將受傷之人拖入車中之后,女子其實已經累的滿身大汗,只是在這風雨交加的夜晚,看不出來罷了。
XX醫院急救室。
“你說什么?死了?”女子瞪大着一雙晶瑩的眼珠,不可思議的凝視着眼前宣布結果的醫生。
此時,在燈光的照耀下,才看清女子的面貌,女子穿着一身白色蕾絲連衣裙,一雙眼睛簡直像浸在水中的水晶一樣澄澈,膚色晶瑩如玉,薄薄的唇,色淡如水,清秀的五官里透露出一種說不出的乖巧。而且由於剛才被大雨淋濕,女子的全身已經濕透,仔細看去,隱約可見其包裹在着裝之內的嫩膚,更是給原本就美到極點的女子添加了一份誘人的姿色。
“是的,本來接上輸氧管后是有微弱的呼吸的,結果過了幾秒鍾之后就徹底斷氣了,對不起,我們已經盡力了。”醫生嘆息一聲說道,緊接着,醫生繼續說道:“這是他臨死前讓我給你的,請節哀吧”。說着,醫生便將手中的一張紙條遞給了女子,而快接觸到女子玉手的時候,醫生忍不住吞了口口水,顯然是被女子的美色驚到了。
女子在聽完醫生的宣判之后,差點暈倒在地,幸好離座位很近,所以才一屁股做到了座位上,不至於摔倒。呆呆的望着正在被緩緩的推往太平間的急救車,女子有點不知所措,她到現在甚至都不知道自己撞死之人姓誰名誰。
想起剛才醫生說的話,女子這才意識到手中握着的紙條,打開一看,女子的表情瞬間凝固了,只見紙條上歪歪曲曲的寫着幾個字:你TM踩着我輸氧管了。
XX醫院太平間。
“尼瑪,二貨醫生,老子用盡了生前的力量,才勉強寫了那么幾個字。這蠢貨也不打開看看,竟然以為我是臨死前寫給女友的小情書,也不想想,老子命都快沒了, 還寫毛毛情書啊。再說,看我這屌絲樣,外面那女神能是我女友嗎。我真是去年買了個表。” 罵罵咧咧的聲音從太平間中傳來,這要是被他人聽到了,估計當場就要被嚇昏過去。
只見一個人影從急救床上緩緩的坐起來,令人驚奇的是,此人竟然生生的穿過了鋪在身上的白布,看上去就像是此人不存在一般。坐起的一人,正是被剛才的貌美女子撞死之人,而此人,正是加班到深夜的小左。
“貌似老子轉生了啊,就是這身體咋跟個魂兒似的,完全沒有實體感啊。難道讓我就這樣每天飄來飄去的,我擦。”看着自己幾乎透明的身體,小左沒有時間為自己的死后轉生所興奮,而是緊皺着眉頭開始琢磨自己的身體。
“啊哈,我擁有異能了啊,這簡直是太TM逆天了。”小左研究了將近三個小時,終於發現了自己的異常。然而在發現自己竟然神奇的擁有了異能之后,小左已然壓抑不住內心的興奮,在太平間里大喊大叫,完全不顧身邊沉睡的眾人們。
不過興奮只持續了片刻,小左便眉頭緊皺,一臉悶悶不樂的樣子,因為他的面前站着八個小左,是的,八個。
小左在研究以后發現,他是擁有異能沒錯,而且可以轉換成屌絲和高富帥的形象,但是讓人抓狂的是,他必須先分離出屌絲和高富帥的分身,然后才能由這兩個分身,再次分離出帶有異能的屌絲和高富帥形象的分身,這些異能分別都有隱身,飛行以及讀心術,而且一個分身同時只能有一種能力。所以這樣兩兩組合,最后就出現了八個小左,分別是純屌絲和高富帥分身,以及擁有一種異能的三個屌絲分身,以及分別擁有一種異能的三個高富帥分身。
不過令人欣喜的是,這八個分身都是真真實實的實體,或者說他們除了有特殊能力之外,其實和現實中的人類是一模一樣的,尤其是具有屌絲模樣的分身,完全和身前的小左一模一樣。不過小左變成高富帥以后的樣子,倒是真的很帥,長眉若柳,身如玉樹,原本坑坑窪窪的臉龐一時間也光滑嫩白,比之女生也絲毫不差。想必就這個樣子,除非是與小左特別熟悉的人,才能仔細的從這分身當中看出一絲似曾相識的感覺。
只是目前這種情況雖說有意外的驚喜,但小左仍然覺得十分糟糕。
原因就是,他要是想使用帶有異能的分身,則至少需要創造兩次分身,一次無技能的屌絲或者高富帥分身,一次則是在此基礎上分離出帶有異能的分身。還有更致命的一點,就是如果以后正在使用某一個技能的分身,而恰巧在關鍵時刻需要使用當前異能之外的兩個的話,則需要臨時替換掉分身,而替換一個分身,則至少需要兩次分身的分離。要知道,分身的產生可是相當耗時的,雖說也不長,但十分八分的,還是要的。
“不知道這種情況,能不能用設計模式解決呢?”哪怕是死后轉生,思維方式依舊沒有變化。前世身為程序猿的小左,在轉生后遇到問題時,第一時間想到的,竟然是設計模式。
說干就干,小左收起八個分身,便控制着自己飄忽的身體開始尋找電腦,因為必須要有電腦,才能激發自己的設計靈感。
尋找的途中,小左也發現,別人竟然完全看不到自己,不過這其實早在小左的意料之中。至於原因,用腳趾頭都能想的明白,都已經變成魂魄了,還能看見個毛啊。
由於此時已至深夜,所以醫院所剩的工作人員寥寥無幾,憑借着可以穿透一切實物的身體,小左很輕易的就找到了一個無人的辦公室。不過當小左按下電腦開機鍵的時候,竟然發現自己的手直接穿過了機箱。
“靠!”憤怒的爆了聲粗口,無奈之下,小左只好暫時將自己不帶異能的屌絲分身給招了出來,用來幫自己操作電腦。
在經過半個多小時左右的捯飭之后,小左已經在機子上安裝好了JDK以及eclipse。於是沒有任何猶豫,小左就開始模擬剛才自己的情況。
“剛才的情況來看,我自己的靈魂體以及八個分身,很明顯應該是一個繼承體系。而我的靈魂體,就是這個繼承體系的超級父類。不過由於靈魂體沒有實體,所以做成抽象的可能更合適點。不過我可以先來個簡單的類圖看一下他們的關系。”小左一邊自言自語,一邊已經開始了在電腦上勾畫類圖。
“畫出類圖果然更加清晰一點,這是一個標准的簡單的繼承體系,下面我就用代碼來嘗試着寫一下吧。”說着,小左便開始在鍵盤上敲打着代碼。
package com.bridge; //抽象靈魂類 public abstract class Soul { public void createDoppelganger(){ System.out.println("制作分身"); } } package com.bridge; //屌絲分身 class Loser extends Soul{ public Loser(){ System.out.println("制造一個無技能的屌絲分身"); } public void doAllLikePeople(){ System.out.println("分身可以像正常人一樣做任何事"); } public void show(){ System.out.println("展示屌絲形象"); } } //高富帥分身 class TRH extends Soul { public TRH(){ System.out.println("制造一個無技能的高富帥分身"); } public void doAllLikePeople(){ System.out.println("分身可以像正常人一樣做任何事"); } public void show(){ System.out.println("展示高富帥形象"); } } package com.bridge; //帶有隱身技能的屌絲分身 class InvisibleLoser extends Loser{ public InvisibleLoser(){ System.out.println("制造一個帶隱身技能的屌絲分身"); } public void releaseSkills(){ System.out.println("屌絲分身釋放隱身技能"); } } //帶有飛行技能的屌絲分身 class VolantLoser extends Loser{ public VolantLoser(){ System.out.println("制造一個帶飛行技能的屌絲分身"); } public void releaseSkills(){ System.out.println("屌絲分身釋放飛行技能"); } } //帶有讀心術技能的屌絲分身 class ReadMindLoser extends Loser{ public ReadMindLoser(){ System.out.println("制造一個帶讀心術技能的屌絲分身"); } public void releaseSkills(){ System.out.println("屌絲分身釋放讀心術技能"); } } //帶有隱身技能的高富帥分身 class InvisibleTRH extends TRH{ public InvisibleTRH(){ System.out.println("制造一個帶隱身技能的高富帥分身"); } public void releaseSkills(){ System.out.println("高富帥分身釋放隱身技能"); } } //帶有飛行技能的高富帥分身 class VolantTRH extends TRH{ public VolantTRH(){ System.out.println("制造一個帶飛行技能的高富帥分身"); } public void releaseSkills(){ System.out.println("高富帥分身釋放飛行技能"); } } //帶有讀心術技能的高富帥分身 class ReadMindTRH extends TRH{ public ReadMindTRH(){ System.out.println("制造一個帶讀心術技能的高富帥分身"); } public void releaseSkills(){ System.out.println("高富帥分身釋放讀心術技能"); } }
“恩,我的靈魂體以及這幾個分身的關系倒是挺簡單粗暴,就是繼承,那么現在這種情況下我在使用的時候,應該就像下面這樣了。”
package com.bridge; public class Use { public static void main(String[] args) { InvisibleLoser invisibleLoser = new InvisibleLoser(); invisibleLoser.releaseSkills(); System.out.println("------------------------------------"); ReadMindTRH readMindTRH = new ReadMindTRH(); readMindTRH.releaseSkills(); System.out.println("------------------------------------"); InvisibleTRH invisibleTRH = new InvisibleTRH(); invisibleTRH.releaseSkills(); } }
看着輸出的結果,小左搖了搖頭,自言自語道:“果然與我剛才的分析一模一樣,每次切換技能的時候,都至少需要制造兩次分身,才可以切換成功,這樣的話,切換技能非常不方便。而且萬一以后我又領悟一個技能,又或者增加了一種外貌,那么分身的數量會急劇增加。”
“那么到底什么設計模式可以解決這個問題呢?”小左喃喃的說道。
在說話的同時,小左已經開始在度娘上搜索合適的設計模式,試圖解決自己的分身問題。
“有了,啊哈。橋接模式正是解決這個問題的利器啊。”小左猶如發現了新大陸一般興奮的叫道,而雙眼則死死的盯着橋接模式的定義。
定義:在軟件系統中,某些類型由於自身的邏輯,它具有兩個或多個維度的變化,那么如何應對這種“多維度的變化”?如何利用面向對象的技術來使得該類型能夠輕松的沿着多個方向進行變化,而又不引入額外的復雜度?這就要使用Bridge模式。而具體使用的方式,則是將抽象部分與他們的實現部分分離,使得它們都可以獨立的變化。
“橋接模式中說到了某些類型,會有兩個或多個維度的變化,這里指的不正是我的分身嗎。我的分身既可以按外貌分類,即屌絲和高富帥,又可以按技能分類,即隱身、飛行和讀心術。不過這使用方式倒是說的有些模糊。”小左看着橋接模式的定義,喃喃的說道。
“還是看下類圖吧,說不定能找到一些端倪。”說着,小左就在度娘上打開了橋接模式的類圖。
“從類圖上看,抽象部分的具體行為交給了實現部分,而就我目前的情況來說,我的不同實現有兩種,一種是外貌,一種是技能。這么說的話,抽象部分和實現部分,通常意義下,應該指的是繼承體系中,接口相同而實現也相同的部分則為抽象部分,而接口相同但是實現不同的部分則為實現部分。”
“這樣的話,按照我目前的情況,制作分身以及像正常人一樣做任何事的方法則是抽象部分,而形象的展示和技能的釋放則是實現部分了。下面我就嘗試着來分離一下吧,哈哈!”有了解決方案,小左不禁心情大好,慌里慌張的就開始嘗試着分離抽象和實現部分。
“首先,我要將實現部分給寫出來,這里有兩個維度,一個是技能,一個是外貌。”
package com.bridge; //技能接口 public interface Skills { public void releaseSkills(); } //隱身技能 class Invisible implements Skills{ public void releaseSkills(){ System.out.println("釋放隱身技能"); } } //飛行技能 class Volant implements Skills{ public void releaseSkills(){ System.out.println("釋放飛行技能"); } } //讀心術技能 class ReadMind implements Skills{ public void releaseSkills(){ System.out.println("釋放讀心術技能"); } }
package com.bridge; //外貌接口 public interface Appearance { public void show(); } //屌絲外形 class Loser implements Appearance{ public void show() { System.out.println("展示屌絲形象"); } } //高富帥外形 class TRH implements Appearance{ public void show() { System.out.println("展示高富帥形象"); } }
“這便是兩個實現化的部分了,現在我已經將它分離出來,剩下的就是要將他們加入到靈魂基類中了。”
package com.bridge; //抽象靈魂類 public abstract class Soul { protected Appearance appearance;//外貌 protected Skills skills;//技能 //具體的實現交給實現部分處理 public void show(){ appearance.show(); } //具體的實現交給實現部分處理 public void releaseSkills(){ skills.releaseSkills(); } public void createDoppelganger(){ System.out.println("制作分身"); } //抽象的方法,留給分身實現 public abstract void doAllLikePeople(); public Soul() { super(); } public Soul(Skills skills) { super(); this.skills = skills; } public Soul(Appearance appearance) { super(); this.appearance = appearance; } public Soul(Appearance appearance, Skills skills) { super(); this.appearance = appearance; this.skills = skills; } public Appearance getAppearance() { return appearance; } public void setAppearance(Appearance appearance) { this.appearance = appearance; } public Skills getSkills() { return skills; } public void setSkills(Skills skills) { this.skills = skills; } }
“這下已經基本搞定了,最后一步則是我要修正一下靈魂類,因為靈魂類只是定義了抽象化的角色,它是需要分身類來修正以后,才可以擁有真正的像人類一樣活動的能力。”
package com.bridge; //分身類 public class Doppelganger extends Soul{ public Doppelganger(){ System.out.println("制作一個暫無外貌和技能的分身"); } public void doAllLikePeople(){ System.out.println("分身可以像正常人一樣做任何事"); } }
“OK了,這下我來看一下現在要使用的話要怎么使用吧。”到了此時,小左明顯已經有點迫不及待了。
package com.bridge; public class Use { public static void main(String[] args) { Soul soul = new Doppelganger(); soul.setAppearance(new TRH());//設置分身外貌為高富帥 soul.setSkills(new Invisible());//設置隱身技能 soul.doAllLikePeople(); System.out.println("----------------------------"); soul.show(); soul.releaseSkills(); System.out.println("----------------------------"); //切換技能 soul.setSkills(new ReadMind()); soul.releaseSkills(); System.out.println("----------------------------"); //切換外貌 soul.setAppearance(new Loser()); soul.show(); System.out.println("----------------------------"); //切換技能 soul.setSkills(new Volant()); soul.releaseSkills(); } }
“不錯不錯。這下我可以隨意切換外貌和技能了,而且要是以后萬一我領悟什么新的技能,按照以前的方式的話,我至少需要添加兩個子類,而要是擁有新的外貌的話,則至少需要添加四個子類,而現在的話,不管是那種情況,我都只需要添加一個子類,就可以隨意切換。”
“不過說起來的話,這好處應該不止這些,我還是專門總結和對比一下吧,省得以后使用的時候遇見什么問題,自己搞不清楚。”
轉生之后,小左還是改不掉前世的習慣,在每次使用設計模式解決完問題之后,都喜歡總結一番。而在世之時,小左的這個習慣,則全是為了在小甜甜面前得瑟所養成的。
“先畫個類圖來看一下現在的關系。”說着,小左便開始畫起類圖來了。
“這圖當中,紅色的則是抽象部分,黃色的則是實現部分,而兩者之間被兩條線連接,看起來就像是一座橋一樣,怪不得這個設計模式叫橋接模式呢。”看着自己畫出來的類圖,小左忽然覺得,橋接模式這個名字,起的實在是妙。
“下面,我就得總結一下前后的好處和壞處了。”
首先,得先總結一下以前的壞處都是哪些。
第一,分身太多,不容易控制。
第二,不同技能和不同外貌之間,切換起來非常不靈活。
第三,要是想添加技能或者外貌的分類的話,要產生的分身非常多。
要是從專業點的角度來分析的話,則應該是下面這幾點了。
第一,子類太多。
第二,由於客戶端與具體子類的耦合度很高,導致在子類間切換非常繁瑣。
第三,如果以后需要擴展子類功能的話,則子類的數目會隨着維度以及每一個維度中子類的個數的增加呈幾何倍數增長。
那么現在的好處則是一下幾點了。
第一,分身的數目減少了,而且伴隨着技能和外貌的種類的增加,這種減少會越來越明顯。
第二,在不同技能和不同外貌之間的切換將會非常靈活。
第三,如果以后技能和外貌的種類增加了,又或者分身又可以按其它的屬性分類了,那么這種添加會非常容易。
如果把好處說的專業一點的話,則是下面這樣。
第一,子類的數目減少了。
第二,實現部分的切換非常容易,主要表現在抽象部分和實現部分的耦合度很低,因為使用聚合取代了繼承。
第三,擴展的時候很簡單,可以更好的容納變化,不論是維度的增加還是每一個維度中子類的個數的增加,都會變得非常簡單。
瘋狂的總結了一番,小左便開始按照橋接模式的設計,嘗試着改變對外貌和技能的控制。
果然,在嘗試了數十次之后,一個普通的分身終於被小左給分離了出來,而小左的靈魂中則保存着屌絲和高富帥的外貌以及三種異能。
伴隨着小左的意念變動,這個普通的分身則會產生響應的變化。忽而是屌絲模樣,忽而又變成了高富帥的樣子,忽而隱形不見,忽而飛出窗外,又迅速的飛回原地,實在是讓小左玩的不亦樂乎。
一年后,魔都某天橋。
“天靈靈,地靈靈,看相算命我最行,上知天文,下知地理,中間明白事理,而且通曉人理,想算命的請找小左先生算命啦。”一個身材高大,長相英俊的小伙子,賣着力氣的叫喊着。
此人,正是開啟了讀心術的小左,而之所以變成現在這樣,則是因為隱身和飛行雖然很酷,但卻偏偏不能拿來賺錢。無奈之下,小左只好委曲求全,先暫時當起了算命先生。說是這么說,但實際上小左現在每天賺的錢,是以前當程序猿時的數倍不止。
此時的他,更是華麗麗的披了一身高富帥的形象,為的就是多吸引幾個女顧客。不過這一招還真的相當湊效,已經有不少穿着暴露,性感火辣的女顧客來光顧了小左的生意。
這不,說着說着,一位穿着火紅短裙的性感辣妹已然來到了小左攤前,“帥哥先生,麻煩你幫我看下,我的命中有沒有你呢?”
“我要收攤了,不好意思。”感受到對方明顯的勾引,小左並沒有任何觸動。而此時剛好也正值傍晚,於是小左只是淡漠的擺了擺手,就打算收攤回家。
這一年中,前世做了二十多年單身屌絲的小左,在擁有了飛行和隱身的異能之后,自然是好好的享受了一番人間樂趣,故而現在縱然是面對這種程度的勾引,小左依然可以做到無動於衷。而之所以變成這樣,不光是因為這一年之中,小左對女人的定力大大增加,最重要的是,面前的女人一看就是只調戲不掏錢的主。
然而就在小左准備轉身回家的時候,卻是被身后一道輕柔的聲音給叫住了。
“您好,可以給我算一下嗎?”
聽到有人叫,小左就打算回頭婉拒之后直接回家,然而就在小左轉過身來,看到面前女子的時候,小左卻猶如被雷擊一般,楞在那里一動不動。片刻之后,才顫抖的說道:“你...你就是...”