谈谈设计模式
大家都知道,設計模式分3類23種,創建型5種,結構型7種,行為型11種。
創建型,字面意思就是用于創建對象的,我們只要創建一個全局共享的對象,比如對模塊接口的封裝,那么就用單例模式;我們要創建很多個對象,就用工廠方法,一個具體的工廠接口創建對象;我們要創建一組相關的對象,就用抽象工廠,將創建各種對象的工廠抽象出來;我們要通過一個原型創建對象,并拷貝原型中的內容到新創建的對象中呢,那就用原型模式;要創建復雜的對象呢,一個對象的創建分為很多步驟,并且我們希望通過控制步驟創建不同的復雜對象,那么就用builder模式,通過傳入direactor不同的builder產生不同的對象。
結構型,字面意思就是描述對象結構的,我想分為3種對象間的結構和4種對象內的結構,說到結構,那么我們第一能想到的就是’部分-整體‘的結構關系,生活中我們看到的物體都是部分組成的整體,那就是組合模式,比如family-tree;除了’部分-整體‘的關系,還有就是平行關系,大家都是一個對象,那么管理這種對象的容器就是享元模式;然后就是橋梁結構,橋梁結構就是將一個部分和另一部分通過橋梁搭連起來,設計模式里的橋接模式就是將接口和實現分離,然后橋接起來,具體說就是接口類+實現類,提供給用戶的是接口類,將創建類指針傳遞給接口類實現功能;對象或模塊間接口兼容性轉換的(比如c++ wrappe c 系統api),用adapter模式,這里只是一對一轉換接口,轉換形式并不改變功能;假如要一對多的接口轉換呢,那么就用facade模式,將多個功能接口轉換為一個用戶關心功能合并的接口;我們知道對象的功能也是通過接口提供給用戶的,那么我們希望增加接口的功能,但是又不能改變對象或者生成子類,那么就用裝飾器模式,通過把對象指針傳遞給一個裝飾器,裝飾器提供的接口與對象接口相同,并在調用對象接口前后增加功能;這幾種都是對象的接口或功能相關的,那么現在我們希望控制或記錄對一個對象的訪問呢,那就是proxy模式,比如智能指針,他只是提供一個對對象訪問的計數,而且他和對象是一對一的關系,并不像裝飾器根據功能可以動態的定義很多裝飾器。
行為型,字面意思就是描述對象行為的,c++的多態是一個行為,不過只是通過將子類對象賦值給基類指針實現,這里我把行為模式分為行為的封裝7種,對象間行為2種,方法的預定義行為1種,解釋語法行1種共4類;舉個例子,人是一個對象,他有不同的狀態(心情),內部狀態不同時對外表現行為也不同;他有不同的知識(算法)儲備,知道該什么時候用感情去感化,什么時候用數學方法;他會與外界通信:電話或者網絡,而不是一個與世隔絕的人;他在不同的社會關系種表現出的行為也是不同的,比如對待陌生人和熟人;封裝了一個操作,將命令對象設置下去,需要的地方調用命令對象的方法,設置回調,在需要的地方調用回調;封裝了多個不同對象的操作,visitor模式;封裝了訪問和遍歷集合中對象的方式,迭代器模式;封裝了不同內部自變化狀態,消除if-else,用戶只管調用操作并不改變狀態,外部調用同一個操作時表現出不同行為(外部并知道當前內部狀態,狀態為內部自變化);封裝了不同算法,通過strategy對象切換,消除switch-case;封裝了不同對象間的通信行為,中介者模式,將各個對象的通信抽象統一起來;封裝了對象的上一個狀態,備忘錄模式;上面都是封裝行為,現在說說對象間的行為,將多個對象連接成鏈,并允許一個命令進行傳遞,那么就是職責鏈模式;將一個對象的狀態變化通知多個感興趣的對象,基于發布-訂閱模型,有觀察者和目標兩個角色,那就是觀察者模式;要解釋一段表達式要表達的內容,也就是求一段表達式的結果,比如執行正則表達式,c++布爾表達式,那就是解釋器模式;現在要規范一個子類的算法行為,讓子類按基類定義的行為在子類選擇重定義某些部分,那就是模板方法模式。對行為的封裝7種(不同對象間的2種,相同對象集合1種,1個對象的4種),對一個表達式的解釋行為1種,定義算法的結構以指導子類的行為1種,對象間的行為2種;定義必須實現的純虛函數,可以重寫的virtual函數,選擇定義的覆蓋同名空函數實現;模板方法非常基本,抽象類與具體類實現種非常常見,比如ACE框架,子類繼承時選擇感興趣的方法重寫;單個對象封裝行為2個,命令模式封裝了一個對象一個的操作,備忘錄模式封裝記錄了一個對象的上一次狀態,visitor模式封裝了多個對象的操作,mediator封裝了多個對象的通信,迭代器封裝了相同對象集合的遍歷和訪問;注意visitor和mediator的主角時visitor和mediator,而不是他們封裝的對象,所以我不劃分為對象間行為而是一種封裝行為;兩個s開頭的分別封裝了不同狀態和不同算法;兩個對象間行為,職責鏈允許請求在不同對象間傳遞,觀察者模式基于發布-訂閱模型,實現通知;模板方法,寫c++的人都用過的,定義一個面試基類,里面有做題,自我介紹,問講;然后子類就根據具體職位實現了,技術類,銷售類流程不是一樣的;技術類里面有c++,java,ios也有差別;解釋器,沒用過,不過知道時干什么的,舉2個例子,搜索正則表達式,find,ls,grep,根據關鍵字過濾,從左往右;布爾表達式a==b||c==d,編譯器或者人計算布爾表達式的值,根據操作符優先級規則,從左往右。
總結
- 上一篇: 交换两个数组的元素使之总和的差值最小
- 下一篇: 谈谈tcp/ip协议