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