主頁 > 知識庫 > 深入剖析Ruby設計模式編程中對命令模式的相關使用

深入剖析Ruby設計模式編程中對命令模式的相關使用

熱門標簽:企業(yè)做大做強 硅谷的囚徒呼叫中心 Win7旗艦版 呼叫中心市場需求 客戶服務 電話運營中心 百度AI接口 語音系統(tǒng)

命令模式是對象行為型使用率比較高的設計模式,別名:Action(動作),Transaction(事務)

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

動機: 方便擴展

結構:

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


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


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

效果:
命令模式將調(diào)用者對象與接收對象解耦(調(diào)用與實現(xiàn)解耦)。調(diào)用者實現(xiàn)功能時只需調(diào)用Command接口的Execute方法。
具體的Commands對象是第一層對象,它們可以像其他對象一樣被擴展或操作。
你可以將多個Commands對象聚合成一個組合命令。組合命令也是組合對象模式的一個實例,將命令排隊也是其的一種特殊情況。
你可以很容易的添加新的命令,因為你并不需要修改現(xiàn)有的代碼。這也符合了開閉原則,對修改關閉,對擴展開放。


實現(xiàn)時應考慮命令對象應達到何種智能程序和支持撤消和重做這兩個問題.


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


類圖:

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聚合一個命令對象Command,聲明Command,PaintCommand,VocalCommand三個具有繼承的命令類,在系統(tǒng)當中可能存在有多個Button,每個Button所要完成的事情是不一樣的,即這個部分是變化的的,也就是方法do_something中的代碼也是不確定的,將這部分的代碼分離到單獨的對象中進行管理,而這個對象就被稱為命令對象,命令對象只負責需要完成的任務或者是指令,主體對象可以根據(jù)自己的需要在任何時間去調(diào)用需要的命令進行執(zhí)行。在調(diào)用處的代碼中也非常清晰的發(fā)現(xiàn)要切換當前Button的命令實現(xiàn)非常方便,也非常靈活,只需要簡單的卻調(diào)用set方法就可以完成。如果采用Button繼承的關系,第一主體對象會造成類爆炸,第二在切換命令實現(xiàn)的時候對比這種方式就會比較困難。
 
使用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來代替命令類更加簡單,易懂,在實際項目環(huán)境中使用proc和命令可以情況而定,如果命令對象非常復雜,需要有自己的狀態(tài)和方法,就選用命令類來完成,如果只是簡單的處理一些小事情,便可以采用proc
 
如果需要執(zhí)行的命令過多,可以定義命令隊列,也就是一個命令里面管理多個命令, 當調(diào)用的時候挨個調(diào)用每個命令進行執(zhí)行,從這一點來非常像組合模式
 
在某中意義上來說觀察者模式和命令模式有一些相像,都是聚合一些具有共同特征的對象到自己類,然后根據(jù)情況來進行調(diào)用。但是2個模式有一個明顯的區(qū)別,就是用途。觀察者模式用于被觀察者將變化通知到各個不同的觀察者身上,而命令模式并不關心是否是通知到其他命令,命令對象只負責執(zhí)行自己的任務或者是指令,并且命令模式可以記住前一次的操作,所以一般來說很多文本編輯器的撤銷/重做都會用到命令模式。

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

標簽:喀什 山西 崇左 安康 濟南 山西 長沙 海南

巨人網(wǎng)絡通訊聲明:本文標題《深入剖析Ruby設計模式編程中對命令模式的相關使用》,本文關鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266