摘要:支持撤銷,隊列,宏命令等功能。宏命令宏命令一組命令集合命令模式與組合模式的產(chǎn)物發(fā)布者發(fā)布一個請求,命令對象會遍歷命令集合下的一系列子命令并執(zhí)行,完成多任務(wù)。
命令模式:請求以命令的形式包裹在對象中,并傳給調(diào)用對象。調(diào)用對象尋找可以處理該命令的合適的對象,并把該命令傳給相應(yīng)的對象,該對象執(zhí)行命令。
生活小栗子:客戶下單,訂單記錄了客戶購買的產(chǎn)品,倉庫根據(jù)訂單給客戶備貨。
模式特點命令模式由三種角色構(gòu)成:
發(fā)布者 invoker(發(fā)出命令,調(diào)用命令對象,不知道如何執(zhí)行與誰執(zhí)行);
接收者 receiver (提供對應(yīng)接口處理請求,不知道誰發(fā)起請求);
命令對象 command(接收命令,調(diào)用接收者對應(yīng)接口處理發(fā)布者的請求)。
發(fā)布者 invoker 和接收者 receiver 各自獨立,將請求封裝成命令對象 command ,請求的具體執(zhí)行由命令對象 command 調(diào)用接收者 receiver 對應(yīng)接口執(zhí)行。
命令對象 command 充當(dāng)發(fā)布者 invoker 與接收者 receiver 之間的連接橋梁(中間對象介入)。實現(xiàn)發(fā)布者與接收之間的解耦,對比過程化請求調(diào)用,命令對象 command 擁有更長的生命周期,接收者 receiver 屬性方法被封裝在命令對象 command 屬性中,使得程序執(zhí)行時可任意時刻調(diào)用接收者對象 receiver 。因此 command 可對請求進行進一步管控處理,如實現(xiàn)延時、預(yù)定、排隊、撤銷等功能。
代碼實現(xiàn)class Receiver { // 接收者類 execute() { console.log("接收者執(zhí)行請求"); } } class Command { // 命令對象類 constructor(receiver) { this.receiver = receiver; } execute () { // 調(diào)用接收者對應(yīng)接口執(zhí)行 console.log("命令對象->接收者->對應(yīng)接口執(zhí)行"); this.receiver.execute(); } } class Invoker { // 發(fā)布者類 constructor(command) { this.command = command; } invoke() { // 發(fā)布請求,調(diào)用命令對象 console.log("發(fā)布者發(fā)布請求"); this.command.execute(); } } const warehouse = new Receiver(); // 倉庫 const order = new Command(warehouse); // 訂單 const client = new Invoker(order); // 客戶 client.invoke(); /* 輸出: 發(fā)布者發(fā)布請求 命令對象->接收者->對應(yīng)接口執(zhí)行 接收者執(zhí)行請求 */應(yīng)用場景
有時候需要向某些對象發(fā)送請求,但是并不知道請求的接收者是誰,也不知道被請求的操作是什么。需要一種松耦合的方式來設(shè)計程序,使得發(fā)送者和接收者能夠消除彼此之間的耦合關(guān)系。
——《JavaScript 設(shè)計模式與開發(fā)實踐》
不關(guān)注執(zhí)行者,不關(guān)注執(zhí)行過程;
只要結(jié)果,支持撤銷請求、延后處理、日志記錄等。
優(yōu)缺點
優(yōu)點:
發(fā)布者與接收者實現(xiàn)解耦;
可擴展命令,對請求可進行排隊或日志記錄。(支持撤銷,隊列,宏命令等功能)。
缺點:
額外增加命令對象,非直接調(diào)用,存在一定開銷。
宏命令宏命令:一組命令集合(命令模式與組合模式的產(chǎn)物)
發(fā)布者發(fā)布一個請求,命令對象會遍歷命令集合下的一系列子命令并執(zhí)行,完成多任務(wù)。
// 宏命令對象 class MacroCommand { constructor() { this.commandList = []; // 緩存子命令對象 } add(command) { // 向緩存中添加子命令 this.commandList.push(command); } exceute() { // 對外命令執(zhí)行接口 // 遍歷自命令對象并執(zhí)行其 execute 方法 for (const command of this.commandList) { command.execute(); } } } const openWechat = { // 命令對象 execute: () => { console.log("打開微信"); } }; const openChrome = { // 命令對象 execute: () => { console.log("打開Chrome"); } }; const openEmail = { // 命令對象 execute: () => { console.log("打開Email"); } } const macroCommand = new MacroCommand(); macroCommand.add(openWechat); // 宏命令中添加子命令 macroCommand.add(openChrome); // 宏命令中添加子命令 macroCommand.add(openEmail); // 宏命令中添加子命令 macroCommand.execute(); // 執(zhí)行宏命令 /* 輸出: 打開微信 打開Chrome 打開Email */傻瓜命令與智能命令
傻瓜命令:命令對象需要接收者來執(zhí)行客戶的請求。智能命令:命令對象直接實現(xiàn)請求,不需要接收者,“聰明”的命令對象。
“傻瓜命令” 與 “智能命令” 的區(qū)別在于是否有 “接收者” 對象。
// openWechat 是智能命令對象,并沒有傳入 receiver 接收對象 const openWechat = { execute: () => { // 命令對象直接處理請求 console.log("打開微信"); } };
沒有 “接收者” 的智能命令與策略模式很類似。代碼實現(xiàn)類似,區(qū)別在于實現(xiàn)目標(biāo)不同。
策略模式中實現(xiàn)的目標(biāo)是一致的,只是實現(xiàn)算法不同(如目標(biāo):根據(jù)KPI計算獎金);
智能命令的解決問題更廣,目標(biāo)更具散發(fā)性。(如目標(biāo):計算獎金/計算出勤率等)。
參考文章
《JavaScript 設(shè)計模式與開發(fā)實踐》
本文首發(fā)Github,期待Star!
https://github.com/ZengLingYong/blog
作者:以樂之名
本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。轉(zhuǎn)載請指明出處。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105635.html
摘要:裝飾者模式裝飾者模式提供比繼承更有彈性的替代方案。裝飾者用于包裝同接口的對象,用于通過重載方法的形式添加新功能,該模式可以在被裝飾者的前面或后面加上自己的行為以達到特定的目的。簡單的理解給對象動態(tài)添加職責(zé)的方式稱為裝飾著模式。 裝飾者模式 裝飾者模式提供比繼承更有彈性的替代方案。裝飾者用于包裝同接口的對象,用于通過重載方法的形式添加新功能,該模式可以在被裝飾者的前面或后面加上自己的行為...
摘要:與門面模式的聯(lián)系本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。我們以中的一個為例,說說實際應(yīng)用中的適配器模式的使用方法。而如果實現(xiàn)層的問題不大,要解決一部分適配問題的話,適配器模式就是很好的選擇了。 與門面模式的聯(lián)系 本文要說的適配器模式和上一篇門面模式在思想上有相似之處,所以放在一起說。它們都對類的接口進行了一些改變。門面模式是把相似的或是完成相關(guān)任務(wù)的接...
摘要:參考鏈接面向?qū)ο缶幊棠P同F(xiàn)在的很多編程語言基本都具有面向?qū)ο蟮乃枷?,比如等等,而面向?qū)ο蟮闹饕枷雽ο?,類,繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學(xué)習(xí)生活中會常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語言是面向?qū)ο蟮牡鹊?,這個編程模型到處可見,但是始終搞不清是什么?什么語言又是什么編程模型,當(dāng)你新接觸一門語言的時候,有些問題是需...
閱讀 2243·2021-11-15 11:39
閱讀 1008·2021-09-26 09:55
閱讀 948·2021-09-04 16:48
閱讀 2868·2021-08-12 13:23
閱讀 934·2021-07-30 15:30
閱讀 2468·2019-08-29 14:16
閱讀 903·2019-08-26 10:15
閱讀 539·2019-08-23 18:40