23种设计模式之命令模式和策略模式的区别
文章目錄
- 概述
- 命令模式
- 策略模式
- 相同點
- 總結
概述
命令模式和策略模式確實很相似,只是命令模式多了一個接收者(Receiver)角色。它們雖然同為行為類模式,但是兩者的區別還是很明顯的。策略模式的意圖是封裝算法,它認為“算法”已經是一個完整的、不可拆分的原子業務(注意這里是原子業務,而不是原子對象),即其意圖是讓這些算法獨立,并且可以相互替換,讓行為的變化獨立于擁有行為的客戶;而命令模式則是對動作的解耦,把一個動作的執行分為執行對象(接收者角色)、執行行為(命令角色),讓兩者相互獨立而不相互影響。
我們從一個相同的業務需求出發,按照命令模式和策略模式分別設計出一套實現,來看看它們的側重點有什么不同。zip和gzip文件格式相信大家都很熟悉,它們是兩種不同的壓縮格式,我們今天就來對一個目錄或文件實現兩種不同的壓縮方式:zip壓縮和gzip壓縮(這里的壓縮指的是壓縮和解壓縮兩種對應的操作行為,下同)。
命令模式
詳情請看之前的文章23種設計模式之命令模式
策略模式
詳情請看之前的文章23種設計模式之策略模式
相同點
-
封裝變化。
-
策略模式封裝算法的變法,命令模式封裝請求的變化。
-
都使用組合來實現功能,達到解耦的目的。
-
如果我們將命令模式做更高層次上的抽象,可以將它看成是一種策略模式。
如:我們將Client與Invoker封裝到一起,將Concrete Command與Receiver封裝到一起。
總結
命令模式可以被抽象地視為一種策略模式,但是顯然命令模式處理的是更為復雜的情況
-
關注點不同
策略模式關注的是算法替換的問題,一個新的算法投產,舊算法退休,或者提供多種算法由調用者自己選擇使用,算法的自由更替是它實現的要點。換句話說,策略模式關注的是算法的完整性、封裝性,只有具備了這兩個條件才能保證其可以自由切換。
命令模式則關注的是解耦問題,如何讓請求者和執行者解耦是它需要首先解決的,解耦的要求就是把請求的內容封裝為一個一個的命令,由接收者執行。由于封裝成了命令,就同時可以對命令進行多種處理,例如撤銷、記錄等。
-
角色功能不同
在我們的例子中,策略模式中的抽象算法和具體算法與命令模式的接收者非常相似,但是它們的職責不同。策略模式中的具體算法是負責一個完整算法邏輯,它是不可再拆分的原子業務單元,一旦變更就是對算法整體的變更。
而命令模式則不同,它關注命令的實現,也就是功能的實現。例如我們在分支中也提到接收者的變更問題,它只影響到命令族的變更,對請求者沒有任何影響,從這方面來說,接收者對命令負責,而與請求者無關。命令模式中的接收者只要符合六大設計原則,完全不用關心它是否完成了一個具體邏輯,它的影響范圍也僅僅是抽象命令和具體命令,對它的修改不會擴散到模式外的模塊。
當然,如果在命令模式中需要指定接收者,則需要考慮接收者的變化和封裝,例如一個老顧客每次吃飯都點同一個廚師的飯菜,那就必須考慮接收者的抽象化問題。
-
使用場景不同
策略模式適用于算法要求變換的場景,而命令模式適用于解耦兩個有緊耦合關系的對象場合或者多命令多撤銷的場景。
這里。。。
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
本文作者:Java技術債務
原文鏈接:https://cuizb.top/myblog/article/1660574818
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY 3.0 CN協議進行許可。轉載請署名作者且注明文章出處。
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
JVM內存泄漏和內存溢出的原因
JVM常用監控工具解釋以及使用
Redis 常見面試題(一)
ClickHouse之MaterializeMySQL引擎(十)
三種實現分布式鎖的實現與區別
線程池的理解以及使用
總結
以上是生活随笔為你收集整理的23种设计模式之命令模式和策略模式的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity简单操作:HDR(一) 给Ca
- 下一篇: 郑轻oj1069