命令模式推導(dǎo)及應(yīng)用場(chǎng)景淺析

前陣子在做一個(gè)東西時(shí),用到了命令模式的變種畏腕,當(dāng)時(shí)有些細(xì)節(jié)記不清了,于是去網(wǎng)上找了一些資料茉稠,結(jié)果越看越迷糊描馅。最后索性自己重新推導(dǎo)了一次,在對(duì)推導(dǎo)過(guò)程作記錄后而线,就有了這篇文章铭污。

問(wèn)題

使用word時(shí),如果做錯(cuò)了某步操作吞获,我們可以進(jìn)行”撤銷(xiāo)”,恢復(fù)到操作之前的狀態(tài)况凉。盡管每種操作都不一樣,但是卻神奇地能用同樣的方式“撤銷(xiāo)”各拷。這是怎么做到的呢刁绒?

解決方案

從上面的描述,我們可以知道烤黍,word能做到這些功能:

  • 以同樣的方式表示所有可以撤銷(xiāo)的操作
  • 記錄所有可以撤銷(xiāo)的操作

由此知市,可以得到以下結(jié)構(gòu):


command_pattern_class1

仔細(xì)看看,好像有個(gè)問(wèn)題: 命令的定義應(yīng)該是通用的速蕊,如輸入一段文字嫂丙,但是我們撤消的是在某個(gè)地方輸入的一段文字,所以還要加上命令執(zhí)行的上下文规哲,這里我們用Receiver來(lái)指代跟啤。更新后的類(lèi)圖:


command_pattern_class2

模式的理解

要理解命令模式,除了從它的應(yīng)用場(chǎng)景推導(dǎo)之外,也可以從它的定義幫助理解:

命令一般應(yīng)用于政府機(jī)構(gòu)中隅肥。當(dāng)某政府首腦發(fā)出命令時(shí)竿奏,一般不會(huì)由該首腦直接面對(duì)執(zhí)行的人,而是通過(guò)類(lèi)似國(guó)務(wù)院等機(jī)構(gòu)發(fā)出腥放。這里的國(guó)務(wù)院等機(jī)構(gòu)就是命令模式里的Invoker泛啸,負(fù)責(zé)記錄和執(zhí)行。

命令里秃症,一般會(huì)說(shuō)清楚候址,要誰(shuí)來(lái)做什么,所以种柑,事實(shí)上命令(這里的命令不同于上面類(lèi)圖里的command)是由receiver和command兩部分組成岗仑。

每過(guò)一段時(shí)間,都有人事上的一些變動(dòng)莹规,為第一次人事變動(dòng)赔蒲,都創(chuàng)建一種命令模板是不可能的,于是良漱,政府對(duì)于主要的命令都規(guī)則了一個(gè)模板舞虱,每次需要的時(shí)間,只要把對(duì)應(yīng)的人和職位變動(dòng)內(nèi)容填上去就可以了母市,這就是我們的command矾兜。

命令模式的類(lèi)圖

這部分網(wǎng)上的資料很多,我就不重復(fù)寫(xiě)了患久,以下內(nèi)容摘自博客

command_pattern_diagra

適合場(chǎng)景與優(yōu)缺點(diǎn)

命令模式有以下優(yōu)點(diǎn):

  1. 命令和實(shí)際的執(zhí)行者分離椅寺,實(shí)際的操作都是通過(guò)invoker以及receiver去執(zhí)行的
  2. 屏蔽了底層的復(fù)雜實(shí)現(xiàn),對(duì)外提供了統(tǒng)一的表現(xiàn)
  3. 可以記錄操作的歷史記錄
  4. 拓展性好蒋失,一方面返帕,可以很方便地添加新的命令,如在word中添加插入html功能篙挽;另一方面荆萤,也可以把命令遷移到另一種場(chǎng)景下,如把word中的命令遷移到excel中
  5. 用戶(hù)使用上铣卡,用戶(hù)通過(guò)組合一些命令链韭,可以實(shí)現(xiàn)宏的功能,效率更高

缺點(diǎn):

  • 代碼冗余較多煮落。每個(gè)命令敞峭,需要同時(shí)修改好幾個(gè)地方,維護(hù)較復(fù)雜

由其優(yōu)缺點(diǎn)蝉仇,可以得出其適用場(chǎng)景:

  • 編輯軟件旋讹,如word,excel中殖蚕,但是由于撤銷(xiāo)依賴(lài)于當(dāng)前狀態(tài),所以如果應(yīng)用的狀態(tài)無(wú)法完整保存骗村,那么不應(yīng)該提供撤銷(xiāo)功能
  • 由第一點(diǎn)嫌褪,可以用于workflow、oa系統(tǒng)等軟件中胚股,用于定義流程、功能節(jié)點(diǎn)
  • 由第三點(diǎn)裙秋,可以用于需要審計(jì)的系統(tǒng)中琅拌,用于審計(jì)
  • shell中,用于對(duì)資源進(jìn)行封裝
  • 第五點(diǎn)在很多文本編輯器中都有體現(xiàn)

不適用的場(chǎng)景:

  • 功能足夠簡(jiǎn)單摘刑。如果功能本身比較簡(jiǎn)單进宝,則不建議引入命令模式,它會(huì)帶來(lái)更多的復(fù)雜性枷恕,以及更高的開(kāi)發(fā)成本
  • 命令的意義不清晰或經(jīng)常變化党晋。命令模式在解耦命令的發(fā)出者與執(zhí)行者的同時(shí),也讓命令發(fā)出者與執(zhí)行者的聯(lián)系不那么清晰徐块,如果修改了命令的意義未玻,要全面修改命令的調(diào)用者,會(huì)比較難
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胡控,一起剝皮案震驚了整個(gè)濱河市扳剿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昼激,老刑警劉巖庇绽,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異橙困,居然都是意外死亡瞧掺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)凡傅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辟狈,“玉大人,你說(shuō)我怎么就攤上這事像捶∩仙拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵拓春,是天一觀(guān)的道長(zhǎng)释簿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)硼莽,這世上最難降的妖魔是什么庶溶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任煮纵,我火速辦了婚禮,結(jié)果婚禮上偏螺,老公的妹妹穿的比我還像新娘行疏。我一直安慰自己,他們只是感情好套像,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布酿联。 她就那樣靜靜地躺著,像睡著了一般夺巩。 火紅的嫁衣襯著肌膚如雪贞让。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天柳譬,我揣著相機(jī)與錄音喳张,去河邊找鬼。 笑死美澳,一個(gè)胖子當(dāng)著我的面吹牛销部,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播制跟,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼舅桩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了凫岖?” 一聲冷哼從身側(cè)響起江咳,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哥放,沒(méi)想到半個(gè)月后歼指,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甥雕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年踩身,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片社露。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挟阻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峭弟,到底是詐尸還是另有隱情附鸽,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布瞒瘸,位于F島的核電站坷备,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏情臭。R本人自食惡果不足惜省撑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一赌蔑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竟秫,春花似錦娃惯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拙吉,卻和暖如春潮孽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筷黔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仗颈,地道東北人佛舱。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挨决,于是被迫代替她去往敵國(guó)和親请祖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,370評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理脖祈,服務(wù)發(fā)現(xiàn)肆捕,斷路器,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 1 場(chǎng)景問(wèn)題# 1.1 如何開(kāi)機(jī)## 估計(jì)有些朋友看到這個(gè)標(biāo)題會(huì)非常奇怪盖高,電腦裝配好了慎陵,如何開(kāi)機(jī)?不就是按下啟動(dòng)按...
    七寸知架構(gòu)閱讀 2,816評(píng)論 1 59
  • 那些對(duì)歲月說(shuō)過(guò)的情話(huà)喻奥,撂下的狠話(huà)席纽,何嘗不是一種戀愛(ài)。 字/ 靜思踐行 圖/ 吾行吾攝 遠(yuǎn)方 天涯 撞蚕, 風(fēng)吹起...
    默燃就燃閱讀 587評(píng)論 0 4
  • 1润梯、 第一次獨(dú)自住一間大房,第一次嘗到自由的味道甥厦。 也是第一次決定獨(dú)自旅行纺铭。 買(mǎi)高鐵票,買(mǎi)機(jī)票刀疙,和在北京的人們聯(lián)系...
    二十萬(wàn)字閱讀 251評(píng)論 0 4