模式總論 總訣式

2021-04-12 13:40:17 字數 2390 閱讀 5829

在**模式的概念之前我們來看乙個例子,獨孤九劍共有九劍,獨孤求敗將不同兵器分門別類來研究破解之道,破劍式用來專門對付所有使劍的高手,破掌式專門對付使掌的高手,而破箭式專門對付各類暗器,當年令狐沖就是用破箭式救了他心愛的小師妹,以及整個華山派。這裡的九劍就是九種模式,它們是獨孤求敗建立的,傳給了風清揚,再傳給令狐沖,說明模式是一種可傳承、重用的一種經驗。各種模式具有各自的價值,各自的出發點或動機也不一樣,換句話說,不同的模式代表了不同的價值衡量標準,如破劍式的價值準則就是打敗所有劍術高手。我們應用時就是靠這種價值準則來識別和選擇模式的。

認識模式並不難,但要給它下乙個定義卻很難,因為每個領域對它的理解不同,所以它是一種很高階的抽象,正如老子的那句話-道可道,非常道,名可名,非常名。模式也是如此,所以我們只要理解了模式的幾個要素,模式的本質和價值觀就可以了。

模式有三大要素:問題,環境,解決方案。

問題當然就是你要解決的問題,注意這裡指的是一類問題,從乙個具體問題中抽象出來的,如果只是乙個問題,只發生一次,就無所謂模式了。就破劍式而言,對付所有的劍法是一類問題,而不僅僅是對付某一種劍法。

環境指的是問題發生的環境,就是說面對乙個有武功的人,他是使劍的還是使掌的得分辨出來,還有就是這人內力的是否高深,就是乙個人的武功環境,了解了這個才能作出決策-用哪一劍對付他。

解決方案自然就是解決問題的一種方法。也就是用破劍式來對付劍術高手。

模式存在的基礎:

模式的存在的目的是因為它要被重用,如果遺失了這個本質,模式就會成為一種束之高閣的理論,模式是依存於具體實踐的,是對具體領域具體問題解決方案的一種抽象。所以模式不是抽象的理論,而是可重用經驗的總結,抽象。

模式具有時效性,舉個例子,我們都有過遠行(旅行,出差,探親)的經歷,比如我們從北京到上海,你打算怎麼走,有幾種可選的模式:走路,坐馬車,乘火車,乘飛機等。走路或坐馬車也是一種模式,但那是一種廢棄的模式,因為在古代我們沒有發達的交通工具,只能如此,而現在科技發展了,它就不再適用了,這也正好驗證了馬克思的「真理是相對的,不是永恆的,任何存在的事物都會滅亡。」

模式具有有限範圍的適用性,認識這一點很重要,比如獨孤九劍,有破劍式和破掌式,破劍式是針對劍類兵器的,而破掌式是針對類似金剛掌,如來掌等掌法類的。如果令狐沖拿著破掌式去對付東方不敗,那早就死定了。再舉個開發中的例子,gof的設計模式中有乙個factory模式,它的好處主要是封裝了一族類的實現(比如一種商品,他們有不同的型號,不同的**,但他們的功能性一致,**也是遵循某種演算法的),由factory決定你要建立的類,你可以在執行時動態地從檔案裡讀取你要例項化的類的id(比如這種商品的某種型號),然後用factory來例項化它,這種執行時的動態特性讓你不必把**寫死-hardcode。而且對使用api的使用者隱藏了具體實現細節的同時又獲得了可擴充套件性,今後當你要新增新的型號的該種商品時你只需新增新的類而不需更改現有的任何類。聽起來不錯,但獲取這種優點是有代價的,會引入複雜性,而且問題是你不是任何時候都需要這麼有類似行為的一族類,如果你只有那麼乙個類就可以了,你當然沒必要把事情搞得那麼複雜。很顯然這種需求是在factory模式的適用範圍之外的。

模式具有原子可操作性,為什麼這麼說,因為乙個設計結構組合應用好幾個模式,就是說各模式之間沒有任何耦合也不存在排斥,他們可以共同分擔責任來構造乙個架構。比如gof的設計模式中有乙個flyweight模式,它本身就是有factory模式和composite模式組合而成的。還有乙個例子就是,我們用command模式時就經常用factory模式來產生command的例項。這種例子還有很多,因此我們說模式是具有原子性的。

模式是可以變異的,模式重要的是它的思想,而不是它的外在表現形式,所以一種模式可能會有很多種變體,我們在實踐中用到的模式可能和教科書上的長的不一樣,但只要它的思想是一致的,在概念上是一致的,那麼你用的模式就是這種模式。比如說gof的設計模式中有乙個singleton模式,我們都知道這個模式是用來保證乙個類只會產生乙個例項,但是你有可能遇到某個應用是需要只產生有限個(比如5個)例項,怎麼辦,很簡單,你把有限個例項儲存在乙個hashmap裡,今後只能有這幾個例項就可以了。這顯然還是singleton的思想,在限制例項個數的概念性上和singleton是一致的。

模式選擇的價值觀:

我們永遠選擇最適合我們需要的模式。選擇用什麼模式是要具體情況具體分析的,需求不同、技術環境不同會直接影響到模式的選擇。在這個領域裡,沒有一成不變的規則。

我們從這個例子可以看到,不同的應用需求我們採用了不同的模式。這說明了模式選擇的價值準則就是,我選擇的模式最適合解決我所關注的問題。關注的點不一樣,選擇就可能不一樣。

另外我們也可以看到,模式沒有絕對的優劣之分,每一種模式都只是在某類需求上體現它的價值。往往當你獲得一種價值和優點的同時可能就意味著失去另一種價值和優點。比如你選擇了singleton模式,可以獲得單一例項的優點,卻失去了可繼承的oo特性。又比如你採用mvc(model-view-control)架構模式時,將領域邏輯和介面可以很好的分離,但獲得這種好處是以複雜性為代價的,會引入很多與你的領域邏輯無關的類。這也就是說每一種模式都只滿足了一類價值準則。  

設計模式總論

it職場的小菜經常有這樣的疑問 為什麼乙個相似的功能,大牛一會兒就搞定,然後悠閒地品著下午茶逛 而自己加班加點搞到天亮還做不完。為什麼使用者提出需求變更後,大牛只需瀟灑地敲敲鍵盤,改改配置 而自己將 改了又改,刪了又建,幾乎暈厥,最後只能推翻重來。為什麼大牛寫完的程式測試上線後,幾乎完美執行,使用者...

設計模式總論

活字印刷 可維護 只改乙個字 可復用 下次可再用 可擴充套件 另加刻字 靈活性好 橫豎都行 說到底是為了做維護方便,讓業務邏輯與介面邏輯分開,耦合度下降。四大發明其它三種都是科技進步,唯有活字印刷是思想的成功,物件導向的設計。可利用的oo手段 封裝,繼承,多型。正如 設計模式 的作者gof對訪問者模...

嵌入式軟體場景式開發總論

軟體的靈魂是 程式語言 資料結構 演算法 邏輯架構。程式語言 以前那種面向過程 物件導向的分類是不正確的,面向過程還是物件導向是設計思想不是程式語言的根本屬性。誠然c語言的設計思想是面向過程,因為當時軟體工程尚不發達,物件導向的設計思想尚未形成。時至今日用c語言寫出具有物件導向思想 高可重用性的 也...