對設計模式的小見解
23種設計模式大名鼎鼎,如雷貫耳。但是當我們仔細剖析其中的內涵時,卻發現
基本上裡面的大部分的設計模式都很雷同
比如狀態機和責任鏈
他們本質上就是在高層模組用相同的程式碼動態切換不同的狀態物件來執行不同的邏輯
傳統的狀態機中,不同的類就代表了不同的狀態
而責任鏈其實和狀態機很像,但是他不用類來區分狀態之間的區別 (一個責任鏈子中的責任物件可以是同一個子類的物件)而是用基類的某個屬性來區分責任物件,通常是列舉或者int? 而這些物件的其他屬性們是可以不一樣的,所以仍然可以表達不同的狀態(比如一組執行相同邏輯的關卡 只是生成的怪物種類,怪物數量的不同)。(是不是鏈子已經無所謂了,我們也可以把這些物件放到一個list中遍歷)
相像的原因,究其根本就是這些模式都是利用了這個程式設計思想:
找到邏輯中可以固化成一種抽象的變化 使其成為介面(文中所有'介面'都是interface的意思),然後高層就能在不需要知道此種抽象的各種不同版本實現的情況下 使用固化的程式碼來實現不同的實際邏輯。
所以總是能找到共同之處!
和上述兩個模式相似的還有策略(靜態的狀態切換),橋接(介面中持有介面),工廠(返回抽象物件的介面)
抽象工廠(有一組返回不同物件的方法的介面,他的本質其實就是介面的本來含義,即一個介面中,有很多方法,然後你可以對這個介面有不同的實現,於是有了各種不同的同組方法,只不過抽象工廠做的事情是返回物件而已)
然後,模板方法和建造者
本質上又是一模一樣的兩種模式
因為建造者就是用模板方法來 組裝一個實際的物件 這些零件是不是要建造者自己new 還是通過其他工廠new 和建造者本身無關
建造者模式(一般用於拼裝元件繁多的物件,比如遊戲中的角色)關注的是公開出一個方法 以獲得一個拼裝完好的物件
而這個方法就是一個模板方法。至於什麼又是模板方法,說白了就是公開一個非虛方法 並在裡面花式調虛方法
花式指的是 可以是靜態的(固定順序的呼叫幾個虛方法) 也可以動態的(比如根據一個序列來決定幾個虛方法的執行順序)
然後,代理和裝飾
這兩個模式的本質就是 兩個不同的類,實現了相同的介面
其中有一個類 持有另一個類物件的引用,然後這個類對介面的實現 是通過呼叫持有的引用的實現來實現的
兩種模式都是對被持有的類的一種功能擴充套件
並且很好的體現了 優先組合 其次繼承的 思想