根據最近熱心讀者的反饋,這裡列出來一些常見的設計模式的問題,進行解答。如何領悟設計模式中的物件導向思想,還是請下載《漫談設計模式》
學習設計模式的一些常見問題
1. 模式有沒有標準形式?
GoF為了描述每一種設計模式,給它們定義了四個基本要素,旨在模式使模式能夠得到廣泛傳播,這並不代表GoF給出的模式就是標準模式。事實上,他們也沒有給每一種模式給出標準,而是很多地方給出了它們可能的變化,比如像組合(Composite)模式,有透明的組合模式,也有安全的組合模式,還例如觀察者(Observer)模式,有push和pull兩種形式。
這些設計模式只是為常見問題給出經驗人士的一個參考方案,避免我們重複的發明輪子,而沒有血統之分(哪個標準,哪個不標準),所以這個問題是個偽命題。
2. 設計模式和OO什麼關係?
設計模式最初引入的時候,正處於物件導向設計高速發展時期,那些模式都是來自成功的物件導向系統的某些部分,所以這23個最基本的模式都是關於物件導向的,但這不表示只有物件導向才有模式。我們知道,模式是是某一上下文環境中一個問題的常用解決方案,那麼,SOA(Service-Oriented Architecture)可以有模式,Agile也可以有模式,OSGI(Open
Services Gateway initiative)也有模式。
3. 能不能創造新的設計模式?
完全可以,只要你能給一個內容相關的問題給出一個通用的解決方案,並能使用GoF的四個基本要素描述它們。但是要避免重複的發明輪子,你必須瞭解你創造的是否已經存在,或者是否是已存在模式的變種。
4. 學習了設計模式,就等於學會了設計?
學習設計模式只是借鑒OO專家的成功經驗,要學會設計,還得向他們一樣,學會使用OO的眼光看待問題,解決問題。這樣,在解決問題的過程中,模式就會手到擒來,並且自然地變化它們以適應你的問題本身。
5. 設計模式是OO設計的根本嗎?
解決問題才是根本,模式只是關於解決問題的經驗總結。筆者最初學習設計模式之後,以為優雅的設計就是儘可能的使用設計模式,所以在解決問題是刻意的套用它們,出現了一些拙劣的設計。後來讀取了Eric Evans的《Domain-Driven Design: Tackling Complexity in
the Heart of Software》一書,才意識到為領域建模的重要性,為解決問題,要為你的領域問題建立合理的模型,既然OO能夠為軟體編程帶來巨大的變化,我們就要學會使用OO的眼光分析問題,享受OO給編程帶來的莫大好處。
於是緊接著,在後來的一個軟體開發中,我開始從問題本質入手,“忘卻”模式,為問題提模數型,等設計開發完成之後,發現,我已經自然而然的使用了組合(Composite)模式和解譯器(Interpreter)等模式。至此,我才意識到使用OO眼光分析問題的重要性,所以,這本書籍並不是單純介紹模式的書籍,而是和大家一起探討OOP,分析OOP給編程帶來的好處,希望閱讀完本書的人都能開始使用OO的眼光分析問題。
6. 軟體的核心是什嗎?
軟體的核心是模型,為複雜領域問題提取精鍊的模型是根本。我們要學會使用OO這把利器,藉助它的眼光來分析問題解決問題,這樣才能做出客戶滿意的軟體。