作者:凸凹裏歐;
來源:輕文社 Todd-Leo

世界處處不設計

設計模式是什麼鬼(初探)


有物混成,先天地生。寂兮寥兮,獨立而不改,周行而不殆,可以爲天地母。吾不知其名,字之曰,強爲之名曰大。大曰逝,逝曰遠,遠曰反。

道是什麼?道可道,非常道。道不明,說不盡的纔算是道,它是自然法則的終極抽象。但至少在某一方面,它是各種事物如何組織在一起以及進行溝通互動的原始規律。而在軟件設計中,各個模塊之間怎樣組織通信成爲一個優雅健壯的整體,以便保證良好的可重用性和擴展性,這對於設計人員至關重要,於是有人將這些組裝模式總結了出來,成爲一種道,設計模式之道。

設計模式是什麼鬼(初探)


首先我們得搞清楚點面向對象的概念,面向對象其實是對現實世界的理解和抽象的方法,也就是在計算機世界裏去模擬現實世界的一種編程方法,具體是利用封裝、繼承、多態的方法去建立模型,我們一個個看下這都是些什麼鬼。

01

封裝


設計模式是什麼鬼(初探)

恩?這是……麥當勞?對,但重點在於那杯可樂,是被蓋子給封起來的,只留了一個孔可以插吸管才能喝。這其實就是封裝,封裝隱藏了內部的可樂,對外留有一個接口來訪問,這樣有啥好處?乾淨!防止外部隨便訪問,比如灰塵落入弄髒內部數據。對外暴露的習慣是非常容易使用的,你根本無需關心內部實現細節,你喝個可樂還在乎氣壓怎麼增大減小導致可樂杯吸出來?非常簡單,一個字:“吸”!

02

繼承

設計模式是什麼鬼(初探)


DNA?生物一代代的延續下來是靠什麼保持其父輩的特徵?遺傳基因,正所謂龍生龍鳳生鳳,老鼠兒子會打洞,沒有這個機制那代碼量會急劇上升,很多功能,資源都是重複的在定義,這樣造成極大的冗餘和浪費!所以就有了繼承機制,兒子從父親那繼承下來一些東西,不需要自己再去拼搏了,比如富二代繼承家產,再比如天生好嗓子,媽媽是王菲。當然,只是單單繼承是沒有意義的,否則不如直接用父類了,所以得有自己的特色,比如增加屬性啊,重寫方法之類。

03

多態


設計模式是什麼鬼(初探)


看清楚哈,是多態不是變態。沒有繼承就沒有多態,這個多態其實跟上面的繼承是有關係的。中華美食博大精深,菜品衆多,色香味俱全,形態各異,但是萬變不離其宗,他們都是食品,也就是說,他們都繼承自食品類,食材都是來自自然界生長出來的有機生物。這不就是繼承麼?等等我還沒說完,多態其實是很巧妙地利用了繼承這個特性實現了另一種機制。我們人類可以喫塑料麼?顯而易見不能,因爲我們的接口只接收上面的天然有機食品類,對於鐵啊什麼的金屬無機物是不能消化的。所以說,我們人類只接受食品類的多態,比如肉,蛋,蔬菜,水果,而決不能是塑料。來看一個多態的具體例子。

設計模式是什麼鬼(初探)


這些是早期的一些個人電腦,看起來它們是該進博物館了,順便懷念下神作的喬幫主。我們發現,越是古老的電腦越是高度集成,某天顯示器壞掉了我們會發現麻煩來了,我們只能去送修,然後把整個殼子拆開進行更換,也許它是焊接在主板上的那就慘了,模塊間的過度依賴造成了極大的耦合度,而更糟的是這種顯示器已經停產了根本買不到新的來匹配,那隻能扔掉了。

設計模式是什麼鬼(初探)


爲了解決這個問題設計人員提出了模塊化的概念,各種設備如雨後春筍般湧現。如:鼠標,鍵盤,攝像頭,打印機,存儲設備……但又有一個問題,每種設備都有一種接口,那電腦主機上得有多少種接口啊?這不坑爹麼?於是出現了接口標準化。

設計模式是什麼鬼(初探)


在各種接口百花齊放的時候,有一種接口勝出了,它就是USB。它提供了一種接口標準,電壓5V,雙工數據傳輸, 供電…… 最重要的是物理上形狀是不一樣的,所以別亂插、別亂捅。

於是乎,我們可以把電腦的模型設計成這樣:

設計模式是什麼鬼(初探)


話說有一個Computer類,一個USB接口,還有各種USB設備,故事就這樣開始了。

Computer:“我上面裝有一個USB接口,我只認識這個接口傳遞過來的數據,誰要跟我溝通你就去找它吧。”

USB:“要接駁我的設備是什麼我不關心,但我規定設備必須有readData()這個方法,但是怎麼實現我不管,總之你得通過這個方法把數據給我。”

Keyboard:“我有readData()這個方法,我已經實現好了,用戶一敲鍵盤我就讀過來傳給你。 O(∩_∩)O。”

Mouse&Camera:“我也是,我也是,我要插!”

USB:“確實多態,夠變態。”

該分的分,該合的合,合合分分,分分合合,此乃陰陽之道。

04

實戰,實戰!


設計模式是什麼鬼(初探)


早期的槍設計非常原始簡陋,打一發子彈要很長時間去準備,裝填時要先把火藥倒入槍管內,然後裝入鉛彈,最後用棍子戳實後才能發射。 射擊時士兵扣動扳機衝擊火藥爆炸,子彈被衝擊出去射殺敵方,然後再循環往復進行裝填這一過程,費時費力,所以我們能看到19世紀戰場上的士兵方陣前後排輪換射擊,後排的士兵實際上在裝填彈藥以節省時間。

爲了解決這個問題,我們開始思考了,既然彈藥裝填困難,那麼不如把彈丸和火藥組合起來,然後封裝在彈殼裏,只要撞擊底火彈頭就會被爆炸的火藥崩出去,這樣直接裝入槍膛一觸即發,殺人方便多了,這個就是“封裝”。

設計模式是什麼鬼(初探)


那麼問題又來了,雖然封裝彈藥節省了很多時間,但一次打一發子彈還是很麻煩不是?那就在子彈之上再包裝一層彈夾吧,這相當於壓棧,最早壓入(push)的子彈最後彈出(pop),先進後出(棧數據結構),這樣子彈打完了只要換彈夾就好了。總之只要槍接收子彈就對了,我們都是子彈的繼承。

設計模式是什麼鬼(初探)


然後設計師做了一件更喪心病狂的事情,他造了個外掛彈夾箱來實現彈夾接口的標準方法,背在身上不停地突突,多態發生了,冷兵器時代結束了,以上UML圖正描述了這種嗜殺如狂的瘋狂設計模式。

相關文章