濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 深入剖析Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用

深入剖析Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用

熱門標(biāo)簽:浦東上海400開頭的電話申請(qǐng) 北京語(yǔ)音電銷機(jī)器人價(jià)格 樂昌電話機(jī)器人 真人語(yǔ)音電銷機(jī)器人系統(tǒng) 武漢呼叫中心外呼系統(tǒng)線路商 開封百應(yīng)電銷機(jī)器人聯(lián)系方式 邯鄲外呼調(diào)研線路 買了外呼系統(tǒng)不想用了怎么辦 電話機(jī)器人電話卡封號(hào)怎么辦

命令模式是對(duì)象行為型使用率比較高的設(shè)計(jì)模式,別名:Action(動(dòng)作),Transaction(事務(wù))

意圖: 將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可對(duì)不同的請(qǐng)求進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可取消的操作
這里所謂的“不同的請(qǐng)求”也既意味著請(qǐng)求可能發(fā)生的變化,是一個(gè)可能擴(kuò)展的功能點(diǎn)。

動(dòng)機(jī): 方便擴(kuò)展

結(jié)構(gòu):

協(xié)作說明:
   參與角色:
    Command 聲明一個(gè)接口以用來實(shí)現(xiàn)某個(gè)操作。
    ConcreteCommand 將動(dòng)作與Reciver對(duì)外綁定,通過調(diào)用Reciver對(duì)象的相應(yīng)方法來實(shí)現(xiàn)Command的方法。
    Client 創(chuàng)建ConcreteCommand對(duì)象,并設(shè)置其Reciver對(duì)象。
  Invoker 要求該Command實(shí)現(xiàn)請(qǐng)求。
  Reciver 知道如何實(shí)現(xiàn)具體的請(qǐng)求的類。
  客戶端創(chuàng)建了一個(gè)具體的Command對(duì)象并指定了其接收者。
  調(diào)用者對(duì)象存儲(chǔ)了此具體的Command對(duì)象。
  調(diào)用者對(duì)象通過執(zhí)行Command對(duì)象的Execute方法來實(shí)現(xiàn)當(dāng)前請(qǐng)求。
  如果命令是可以撤銷時(shí),具體對(duì)象在調(diào)用執(zhí)行方法前將存儲(chǔ)相應(yīng)的狀態(tài)以用來命令此請(qǐng)求。
  具體的Command對(duì)象調(diào)用其接收者的方法從而來實(shí)現(xiàn)相應(yīng)請(qǐng)求。


適用性:
類似于 MenuItem , 抽象出待執(zhí)行的動(dòng)作以參數(shù)化某對(duì)象
在不同的時(shí)刻指定,排列,執(zhí)行請(qǐng)求
支持撤消
支持修改日志
在構(gòu)建在原語(yǔ)操作上的高層操作構(gòu)造一個(gè)系統(tǒng)(其實(shí)就是事務(wù))


動(dòng)態(tài)性方面: 像ruby中 block 就是命令模式

效果:
命令模式將調(diào)用者對(duì)象與接收對(duì)象解耦(調(diào)用與實(shí)現(xiàn)解耦)。調(diào)用者實(shí)現(xiàn)功能時(shí)只需調(diào)用Command接口的Execute方法。
具體的Commands對(duì)象是第一層對(duì)象,它們可以像其他對(duì)象一樣被擴(kuò)展或操作。
你可以將多個(gè)Commands對(duì)象聚合成一個(gè)組合命令。組合命令也是組合對(duì)象模式的一個(gè)實(shí)例,將命令排隊(duì)也是其的一種特殊情況。
你可以很容易的添加新的命令,因?yàn)槟悴⒉恍枰薷默F(xiàn)有的代碼。這也符合了開閉原則,對(duì)修改關(guān)閉,對(duì)擴(kuò)展開放。


實(shí)現(xiàn)時(shí)應(yīng)考慮命令對(duì)象應(yīng)達(dá)到何種智能程序和支持撤消和重做這兩個(gè)問題.


誤用:
不要著迷 到底哪個(gè)簡(jiǎn)單?
命令模式不是說“做這個(gè)” 說“ 記住這個(gè)如何做”,稍后再說”按照我剛才要你記住的方法做這個(gè)”
小心撤銷,許多操作是破壞性的,如刪除文件操作


類圖:

class Button
 
 attr_accessor :name, :command
 
 def initialize name, command
  @name = name
  @command = command
 end
 
 def do_something
  @command.execute
 end
 
end

class Command
 
 def execute
  "root execute"
 end
 
end

class PaintCommand  Command
 
 def execute
  "draw something"
 end
 
end

class VocalCommand  Command
 
 def execute
  "talk something"
 end
 
end

paintCommand = PaintCommand.new
vocalCommand = VocalCommand.new
button = Button.new("button", paintCommand)
p button.do_something
button.command = vocalCommand
p button.do_something

 定義了主體類Button,Button聚合一個(gè)命令對(duì)象Command,聲明Command,PaintCommand,VocalCommand三個(gè)具有繼承的命令類,在系統(tǒng)當(dāng)中可能存在有多個(gè)Button,每個(gè)Button所要完成的事情是不一樣的,即這個(gè)部分是變化的的,也就是方法do_something中的代碼也是不確定的,將這部分的代碼分離到單獨(dú)的對(duì)象中進(jìn)行管理,而這個(gè)對(duì)象就被稱為命令對(duì)象,命令對(duì)象只負(fù)責(zé)需要完成的任務(wù)或者是指令,主體對(duì)象可以根據(jù)自己的需要在任何時(shí)間去調(diào)用需要的命令進(jìn)行執(zhí)行。在調(diào)用處的代碼中也非常清晰的發(fā)現(xiàn)要切換當(dāng)前Button的命令實(shí)現(xiàn)非常方便,也非常靈活,只需要簡(jiǎn)單的卻調(diào)用set方法就可以完成。如果采用Button繼承的關(guān)系,第一主體對(duì)象會(huì)造成類爆炸,第二在切換命令實(shí)現(xiàn)的時(shí)候?qū)Ρ冗@種方式就會(huì)比較困難。
 
使用ruby proc來完成命令模式 :
 

class Button
 
 attr_accessor :name
 
 def initialize name, command
  @name = name
 end
 
 def do_something command
  command.call
 end
 
end

paint_command = lambda do
 p "paint something"
end

vocal_command = lambda do
  p "talk something"
end

button = Button.new ("name")
button.do_something vocal_command
button.do_something paint_command

 可以看到使用block來代替命令類更加簡(jiǎn)單,易懂,在實(shí)際項(xiàng)目環(huán)境中使用proc和命令可以情況而定,如果命令對(duì)象非常復(fù)雜,需要有自己的狀態(tài)和方法,就選用命令類來完成,如果只是簡(jiǎn)單的處理一些小事情,便可以采用proc
 
如果需要執(zhí)行的命令過多,可以定義命令隊(duì)列,也就是一個(gè)命令里面管理多個(gè)命令, 當(dāng)調(diào)用的時(shí)候挨個(gè)調(diào)用每個(gè)命令進(jìn)行執(zhí)行,從這一點(diǎn)來非常像組合模式
 
在某中意義上來說觀察者模式和命令模式有一些相像,都是聚合一些具有共同特征的對(duì)象到自己類,然后根據(jù)情況來進(jìn)行調(diào)用。但是2個(gè)模式有一個(gè)明顯的區(qū)別,就是用途。觀察者模式用于被觀察者將變化通知到各個(gè)不同的觀察者身上,而命令模式并不關(guān)心是否是通知到其他命令,命令對(duì)象只負(fù)責(zé)執(zhí)行自己的任務(wù)或者是指令,并且命令模式可以記住前一次的操作,所以一般來說很多文本編輯器的撤銷/重做都會(huì)用到命令模式。

您可能感興趣的文章:
  • 設(shè)計(jì)模式中的觀察者模式在Ruby編程中的運(yùn)用實(shí)例解析
  • 實(shí)例解析Ruby設(shè)計(jì)模式開發(fā)中對(duì)觀察者模式的實(shí)現(xiàn)
  • Ruby設(shè)計(jì)模式編程中對(duì)外觀模式的應(yīng)用實(shí)例分析
  • 詳解組合模式的結(jié)構(gòu)及其在Ruby設(shè)計(jì)模式編程中的運(yùn)用
  • 設(shè)計(jì)模式中的模板方法模式在Ruby中的應(yīng)用實(shí)例兩則
  • 實(shí)例解析Ruby設(shè)計(jì)模式編程中Strategy策略模式的使用
  • 實(shí)例講解Ruby使用設(shè)計(jì)模式中的裝飾器模式的方法
  • Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例
  • 詳解Ruby設(shè)計(jì)模式編程中對(duì)單例模式的運(yùn)用
  • Ruby設(shè)計(jì)模式編程之適配器模式實(shí)戰(zhàn)攻略
  • Ruby使用設(shè)計(jì)模式中的代理模式與裝飾模式的代碼實(shí)例
  • Ruby中使用設(shè)計(jì)模式中的簡(jiǎn)單工廠模式和工廠方法模式
  • 解析proxy代理模式在Ruby設(shè)計(jì)模式開發(fā)中的運(yùn)用

標(biāo)簽:鄂州 松原 自貢 石嘴山 六安 淄博 宜春 河北

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《深入剖析Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用》,本文關(guān)鍵詞  深入,剖析,Ruby,設(shè)計(jì)模式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《深入剖析Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于深入剖析Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    屏东县| 洛宁县| 普陀区| 武夷山市| 株洲市| 东明县| 明溪县| 科技| 巴青县| 唐河县| 盘锦市| 平乡县| 安康市| 婺源县| 喀什市| 安徽省| 万盛区| 磐石市| 黄山市| 石门县| 石楼县| 鹤山市| 防城港市| 岚皋县| 若羌县| 拉萨市| 鹤庆县| 福贡县| 高碑店市| 克什克腾旗| 丹巴县| 巫溪县| 绥棱县| 温泉县| 清远市| 磴口县| 巴东县| 手游| 莱州市| 德阳市| 区。|