生活随笔
收集整理的這篇文章主要介紹了
设计模式之行为类模式PK
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
行為類模式包括:
責(zé)任鏈模式命令模式解釋器模式迭代器模式中介者模式備忘錄模式觀察者模式狀態(tài)模式策略模式模板方法模式訪問者模式
行為型模式涉及到算法和對(duì)象間職責(zé)的分配
行為類模式關(guān)注如何管理對(duì)象的行為.
命令模式VS策略模式
策略模式和命令模式相似, 特別是命令模式退化時(shí),比如無接收者(接收者非常簡(jiǎn)單或者接收者是Java的基礎(chǔ)操作,無需專門寫一個(gè)接收者), 這種情況下, 命令模式和策略模式的類圖完全一樣. 但是兩者還是有區(qū)別的:
關(guān)注點(diǎn)不同. 策略模式關(guān)注的是算法替換的問題, 關(guān)注的是算法的完整性、封裝性, 只有具備了這兩個(gè)條件才能保證其可以自由更換角色功能不同. 策略模式中的具體算法是負(fù)責(zé)一個(gè) 完整算法邏輯,它是不可再分的原子業(yè)務(wù)單元,一旦變更就是對(duì)算法整體的變更.而命令模式關(guān)注命令的實(shí)現(xiàn), 也就是功能的實(shí)現(xiàn), 命令模式中的接收者只要符合六大設(shè)計(jì)原則,完全不用關(guān)心它是否完成了一個(gè)具體邏輯,它的影響范圍也 僅僅是抽象命令和具體命令, 對(duì)他的修改不會(huì)擴(kuò)散到模式外的模塊使用場(chǎng)景不用. 策略模式適用于算法要求變換的場(chǎng)景, 而命令模式適用于解耦兩個(gè)有緊耦合關(guān)系的對(duì)象場(chǎng)合或者多命令多撤銷的場(chǎng)景
策略模式VS狀態(tài)模式
策略模式和狀態(tài)模式都是通過一個(gè) Context 類封裝一個(gè)具體的行為, 都提供了一個(gè)封裝的方法,是高擴(kuò)展性的設(shè)計(jì)模式. 但是, 策略模式封裝的是不同的算法,而狀態(tài)模式封裝的是不同的狀態(tài). 兩種模式雖然都有變換的行為, 但是兩者的目標(biāo)缺不同. 策略模式與狀態(tài)模式不同點(diǎn)如下:
環(huán)境角色的職責(zé)不同. 兩者都有一個(gè)Context 環(huán)境角色的類. 策略模式的環(huán)境角色只是一個(gè)委托作用,負(fù)責(zé)算法的替換; 而狀態(tài)模式的環(huán)境角色不僅僅是委托行為,它還具有登記狀態(tài)變化的功能,與具體的狀態(tài)類協(xié)作,共同完成狀態(tài)切換行為隨之切換的任務(wù)解決問題的重點(diǎn)不同. 策略模式旨在解決內(nèi)部算法如何改變的問題, 也就是將內(nèi)部算法的改變對(duì)外界的影響降低到最小; 而狀態(tài)模式旨在解決內(nèi)在狀態(tài)的改變而引起行為改變的問題, 它的 出發(fā)點(diǎn)是事物的狀態(tài),封裝狀態(tài) 而暴露行為,一個(gè) 對(duì)象的狀態(tài)改變,從外界來看就好像是行為改變.解決問題的方法不同. 策略模式只是確保算法可以自由切換,但是什么時(shí)候用什么算法它決定不了; 而狀態(tài)模式對(duì)外暴露的是行為,狀態(tài)的變化一般是由環(huán)境角色和具體狀態(tài)共同完成的, 也就是說狀態(tài)模式封裝了狀態(tài)的變化而暴露了不同的行為或行為結(jié)果應(yīng)用場(chǎng)景不同. 策略模式的算法必須是平行的,否則就封裝了一堆垃圾. 狀態(tài)模式則要求有一系列狀態(tài)發(fā)生變化的場(chǎng)景, 它要求有狀態(tài)且有行為的場(chǎng)景.復(fù)雜度不同. 通常策略模式比較簡(jiǎn)單, 這里簡(jiǎn)單是指結(jié)構(gòu)簡(jiǎn)單,擴(kuò)展比較容易,而且代碼也容易閱讀. 而狀態(tài)模式通常比較復(fù)雜,因?yàn)樗獜膬蓚€(gè)角色看到一個(gè)對(duì)象狀態(tài)和行為的改變,也就是說它封裝的是變化,而變化是無窮的, 因此相對(duì)來說狀態(tài)模式通常都比較復(fù)雜, 涉及面很多,雖然也很容易擴(kuò)展,但是一般不會(huì)進(jìn)行大規(guī)模的擴(kuò)張和修正
觀察者模式VS責(zé)任鏈模式
這兩個(gè)模式好像沒有太多的相似性啊. 我們?cè)谟^察者模式中, 一個(gè)具體的角色既可以是觀察者, 也可以是被觀察者, 這樣就形成了一個(gè)觀察者鏈.這與責(zé)任鏈模式非常相似, 都實(shí)現(xiàn)了事務(wù)的鏈條化處理. 但是他們還是有區(qū)別的, 區(qū)別如下:
鏈中的消息對(duì)象不同. 責(zé)任鏈模式基本上不改變消息對(duì)象的結(jié)構(gòu), 雖然每個(gè)節(jié)點(diǎn)都可以參與消費(fèi),但是它的結(jié)構(gòu)不會(huì)改變, 比如從首節(jié)點(diǎn)傳遞進(jìn)來一個(gè)String對(duì)象, 不會(huì)到鏈尾的時(shí)候成了int對(duì)象,這在責(zé)任鏈模式中式不可能的, 但是在觀察者鏈中是允許的,鏈中傳遞的對(duì)象可以自由變化,只要上下級(jí)節(jié)點(diǎn)對(duì)傳遞對(duì)象了解即可,它不要求鏈中的消息對(duì)象不變化,只要求鏈中相鄰兩個(gè)節(jié)點(diǎn)的消息對(duì)象固定上下節(jié)點(diǎn)的關(guān)系不同. 在責(zé)任鏈中, 上下節(jié)點(diǎn)沒有關(guān)系, 都是接受同樣的對(duì)象,所有傳遞的對(duì)象都是從鏈?zhǔn)讉鬟f過來,,上一節(jié)點(diǎn)是什么沒有關(guān)系,只要按照自己的邏輯處理就成. 而觀察者鏈就不同了, 它的上下級(jí)關(guān)系很親密,下級(jí)對(duì)上級(jí)頂禮膜拜,上級(jí)對(duì)下級(jí)絕對(duì)信任,鏈中的任意兩個(gè)相鄰節(jié)點(diǎn) 都是一個(gè)牢固的獨(dú)立團(tuán)體消息的分銷渠道不同. 在責(zé)任鏈中,一個(gè)消息從鏈?zhǔn)讉鬟f進(jìn)來后,就開始沿著鏈條想鏈尾運(yùn)動(dòng), 方向是單一的,固定的; 而觀察者鏈則不同, 由于它采用的是觀察者模式,所以有非常大的靈活性,一個(gè)消息傳遞到鏈?zhǔn)缀?具體怎么傳遞時(shí)不固定的,可以以廣播方式傳遞,也可以以跳躍方式傳遞,這取決于處理消息的邏輯.
總結(jié)
以上是生活随笔為你收集整理的设计模式之行为类模式PK的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。