精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:說說你對命令模式的理解?應用場景?

開發 前端
命令模式是最簡單和優雅的模式之一,命令模式中的命令指的是一個執行某些特定事情的指令。

[[434039]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰 。轉載本文請聯系JS每日一題公眾號。

一、是什么

命令模式是最簡單和優雅的模式之一,命令模式中的命令指的是一個執行某些特定事情的指令

該模式旨在將函數的調用、請求和操作封裝成為一個單一的對象

請求以命令的形式包裹在對象中,并傳給調用對象。調用對象尋找可以處理該命令的合適的對象,并把該命令傳給相應的對象,該對象執行命令

例如在一個快餐店,用戶向服務員點餐。服務員將用戶的需求記錄在清單上:

  • 請求者點菜:參數是菜名(我要什么菜),時間(什么時候要),該需求封裝起來后,如果有變化我可以修改參數
  • 命令模式將點餐內容封裝成為命令對象,命令對象就是填寫的清單
  • 用戶不知道接收者(廚師)是誰,也不知道廚師的炒菜方式與步驟
  • 請求者可以要求修改命令執行時間,例如晚1小時再要

二、實現

命令模式由三種角色構成:

  • 發布者 invoker(發出命令,調用命令對象,不知道如何執行與誰執行)
  • 接收者 receiver (提供對應接口處理請求,不知道誰發起請求)
  • 命令對象 command(接收命令,調用接收者對應接口處理發布者的請求)

 

圖片

 

實現代碼如下:

  1. class Receiver {  // 接收者類 
  2.   execute() { 
  3.     console.log('接收者執行請求'); 
  4.   } 
  5.  
  6. class Command {   // 命令對象類 
  7.   constructor(receiver) { 
  8.     this.receiver = receiver; 
  9.   } 
  10.   execute () {    // 調用接收者對應接口執行 
  11.     console.log('命令對象->接收者->對應接口執行'); 
  12.     this.receiver.execute(); 
  13.   } 
  14.  
  15. class Invoker {   // 發布者類 
  16.   constructor(command) { 
  17.     this.command = command; 
  18.   } 
  19.   invoke() {      // 發布請求,調用命令對象 
  20.     console.log('發布者發布請求'); 
  21.     this.command.execute(); 
  22.   } 
  23.  
  24. const warehouse = new Receiver();       // 廚師 
  25. const order = new Command(warehouse);   // 訂單 
  26. const client = new Invoker(order);      // 請求者 
  27. client.invoke(); 

三、應用場景

命令模式最常見的應用場景是:有時候需要向某些對象發送請求,但是并不知道請求的接收者是誰,也不知道被請求的操作是什么。此時,希望用一種松耦合的方式來設計程序,使的請求發送者和請求接收者能夠消除彼此之間的耦合關系

菜單

現在我們需要實現一個界面,包含很多個按鈕。每個按鈕有不同的功能,我們利用命令模式來完成

  1. <button id="button1"></button> 
  2. <button id="button2"></button> 
  3. <button id="button3"></button> 
  4.  
  5. <script> 
  6.   var button1 = document.getElementById("button1"); 
  7.   var button2 = document.getElementById("button2"); 
  8.   var button3 = document.getElementById("button3"); 
  9. </script> 

然后定義一個setCommand函數,負責將按鈕安裝命令,可以確定的是,點擊按鈕會執行某個 command 命令,執行命令的動作被約定為調用 command 對象的 execute() 方法。如下:

  1. var button1 = document.getElementById('button1'
  2. var setCommand = function(button, conmmand) { 
  3.   button.onclick = function() { 
  4.     conmmand.execute() 
  5.   } 

點擊按鈕之后具體行為包括刷新菜單界面、增加子菜單和刪除子菜單等,這幾個功能被分布在 MenuBar 和 SubMenu 這兩個對象中:

  1. var MenuBar = { 
  2.   refresh: function() { 
  3.     console.log('刷新菜單目錄'
  4.   } 
  5. var SubMenu = { 
  6.   addfunction() { 
  7.     console.log('增加子菜單'
  8.   }, 
  9.   del: function(){ 
  10.     console.log('刪除子菜單'); 
  11.   } 

這些功能需要封裝在對應的命令類中:

  1. // 刷新菜單目錄命令類 
  2. class RefreshMenuBarCommand { 
  3.     constructor(receiver) { 
  4.         this.receiver = receiver; 
  5.     } 
  6.  
  7.     execute() { 
  8.         this.receiver.refresh(); 
  9.     } 
  10.  
  11. // 增加子菜單命令類 
  12. class AddSubMenuCommand { 
  13.     constructor(receiver) { 
  14.         this.receiver = receiver; 
  15.     } 
  16.  
  17.     execute() { 
  18.         this.receiver.refresh(); 
  19.     } 
  20.  
  21. // '刪除子菜單命令類 
  22. class DelSubMenuCommand { 
  23.     constructor(receiver) { 
  24.         this.receiver = receiver; 
  25.     } 
  26.  
  27.     execute() { 
  28.         this.receiver.refresh(); 
  29.     } 

最后就是把命令接收者傳入到 command 對象中,并且把 command 對象安裝到 button 上面:

  1. var refreshMenuBarCommand = new RefreshMenuBarCommand(MenuBar); 
  2. var addSubMenuCommand = new AddSubMenuCommand(SubMenu); 
  3. var delSubMenuCommand = new DelSubMenuCommand(SubMenu); 
  4.  
  5. setCommand(button1, refreshMenuBarCommand); 
  6. setCommand(button2, addSubMenuCommand); 
  7. setCommand(button3, delSubMenuCommand); 

撤銷

命令模式的作用不僅是封裝運算塊,而且可以很方便地給命令對象增加撤銷操作

頁面中有一個 input 文本框和一個 button 按鈕,文本框中可以輸入一些數字,表示小球移動后的水平位置,小球在用戶點擊按鈕后立刻開始移動,如下:

  1. <div 
  2.   id="ball" 
  3.   style="position: absolute; background: #000; width: 50px; height: 50px" 
  4. ></div> 
  5. 輸入小球移動后的位置:<input id="pos" /> 
  6. <button id="moveBtn">開始移動</button> 
  7. <script> 
  8.   var ball = document.getElementById("ball"); 
  9.   var pos = document.getElementById("pos"); 
  10.   var moveBtn = document.getElementById("moveBtn"); 
  11.   moveBtn.onclick = function () { 
  12.     var animate = new Animate(ball); 
  13.     animate.start("left", pos.value, 1000, "strongEaseOut"); 
  14.   }; 
  15. </script> 

換成命令模式如下:

  1. var ball = document.getElementById("ball"); 
  2. var pos = document.getElementById("pos"); 
  3. var moveBtn = document.getElementById("moveBtn"); 
  4. var MoveCommand = function (receiver, pos) { 
  5.   this.receiver = receiver; 
  6.   this.pos = pos; 
  7. }; 
  8. MoveCommand.prototype.execute = function () { 
  9.   this.receiver.start("left", this.pos, 1000, "strongEaseOut"); 
  10. }; 
  11. var moveCommand; 
  12. moveBtn.onclick = function () { 
  13.   var animate = new Animate(ball); 
  14.   moveCommand = new MoveCommand(animate, pos.value); 
  15.   moveCommand.execute(); 
  16. }; 

撤銷操作的實現一般是給命令對象增加一個名為 unexecude 或者 undo的方法,在該方法里執行 execute 的反向操作

在 command.execute 方法讓小球開始真正運動之前,需要先記錄小球的當前位置,在 unexecude 或者 undo 操作中,再讓小球回到剛剛記錄下的位置,代碼如下:

  1. class MoveCommand { 
  2.     constructor(receiver, pos) { 
  3.         this.receiver = receiver; 
  4.         this.pos = pos; 
  5.         this.oldPos = null
  6.     } 
  7.  
  8.     execute() { 
  9.         this.receiver.start('left', this.pos, 1000, 'strongEaseOut'); 
  10.         this.oldPos = this.receiver.dom.getBoundingClientRect()[this.receiver.propertyName];  // 記錄小球開始移動前的位置 
  11.     } 
  12.  
  13.     undo() { 
  14.         this.receiver.start('left', this.oldPos, 1000, 'strongEaseOut'); // 回到小球移動前記錄的位置 
  15.     } 
  16.  
  17. var moveCommand; 
  18. moveBtn.onclick = function () { 
  19.   var animate = new Animate(ball); 
  20.   moveCommand = new MoveCommand(animate, pos.value); moveCommand.execute(); 
  21. }; 
  22. cancelBtn.onclick = function () { 
  23.   moveCommand.undo();// 撤銷命令 
  24. }; 

現在通過命令模式輕松地實現了撤銷功能。如果用普通方法調用來實現,也許需要每次都手工記錄小球的運動軌跡,才能讓它還原到之前的位置

而命令模式中小球的原始位置在小球開始移動前已經作為 command 對象的屬性被保存起來,所以只需要再提供一個 undo 方法,并且在 undo方法中讓小球會到剛剛記錄的原始位置就可以

參考文獻

https://www.runoob.com/design-pattern/command-pattern.html

https://juejin.cn/post/6844903673697402888

https://juejin.cn/post/6995474681813811208

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-11-05 07:47:56

代理模式對象

2021-11-10 07:47:49

組合模式場景

2021-11-03 14:10:28

工廠模式場景

2021-11-11 16:37:05

模板模式方法

2021-11-22 23:50:59

責任鏈模式場景

2021-09-16 07:52:18

算法應用場景

2021-08-16 08:33:26

git

2021-11-04 06:58:32

策略模式面試

2021-09-28 07:12:09

測試路徑

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-29 07:24:20

場景數據

2021-10-13 18:01:33

快速排序場景

2021-09-10 06:50:03

TypeScript裝飾器應用

2021-10-08 09:59:32

冒泡排序場景

2021-10-09 10:25:41

排序應用場景

2021-09-08 07:49:34

TypeScript 泛型場景

2021-05-31 10:35:34

TCPWebSocket協議

2021-06-01 08:25:06

Node.jsJavaScript運行

2021-10-18 07:51:39

回溯算法面試

2021-10-12 07:15:02

歸并排序場景
點贊
收藏

51CTO技術棧公眾號

成人黄色免费片| 亚洲男女性事视频| 国产乱子伦精品无码专区| 国产欧美一级片| 在线欧美三区| 亚洲视频专区在线| 亚洲色图偷拍视频| jizz一区二区三区| 久久男人中文字幕资源站| 欧美做受高潮电影o| 四虎地址8848| 国产成人tv| 欧美亚洲禁片免费| 国产一区二区三区播放| 青青青草网站免费视频在线观看| 日本色综合中文字幕| 久热精品视频在线免费观看| 熟女人妻在线视频| 婷婷久久综合九色综合99蜜桃| 亚洲国产精品一区二区www在线| 欧美资源一区| 国模人体一区二区| 久久电影国产免费久久电影| 欧美野外猛男的大粗鳮| 一区二区成人免费视频| 经典一区二区| 亚洲成人网在线| 在线观看免费的av| 午夜激情在线播放| 亚洲青青青在线视频| 免费国产一区二区| 国产综合视频在线| 国产精品综合二区| 国产精品夜色7777狼人| 特级毛片www| 午夜天堂精品久久久久| 色噜噜国产精品视频一区二区 | 蜜臀久久99精品久久久久宅男| 九色精品美女在线| 久久精品亚洲a| 国产一区二区三区网| 日韩高清免费观看| 漂亮人妻被黑人久久精品| 欧美另类中文字幕| 正在播放亚洲一区| 日韩一级免费片| 中文字幕日本一区二区| 色激情天天射综合网| 成人性免费视频| 激情在线视频播放| 亚洲免费观看高清完整版在线观看熊| 伊人久久av导航| 免费在线观看av网站| 国产精品久久久久三级| 亚洲一区二区精品在线| 日本高清视频在线观看| 国产精品久久三区| 中文字幕一区二区三区精彩视频 | 色偷偷偷亚洲综合网另类| 日韩中文字幕电影| 欧美激情在线免费| 国产亚洲xxx| 亚洲一区 欧美| 日韩成人精品一区二区| 日韩中文字幕亚洲| 中文字幕在线有码| 欧美视频久久| 久久久久免费视频| 久草视频精品在线| 日韩一区二区久久| 欧美重口另类videos人妖| 麻豆精品久久久久久久99蜜桃| 久久在线精品| 国产精品视频地址| 97人妻精品一区二区三区视频 | 午夜精品福利在线| 国产成人在线免费看| 人人视频精品| 欧美日韩国产bt| 女王人厕视频2ⅴk| 久久精品亚洲成在人线av网址| 日韩大片在线观看视频| 最新中文字幕视频| 日本女优一区| 欧美精品做受xxx性少妇| 久久精品www人人爽人人| 国产精品老牛| 国产精品亚洲综合天堂夜夜| www日本高清| 久久伊人中文字幕| 一区二区三区四区五区精品| 午夜av在线播放| 好吊成人免视频| 手机免费看av网站| 激情小说亚洲色图| 中文字幕亚洲激情| 久久午夜无码鲁丝片午夜精品| 免费日韩一区二区| 成人av电影天堂| 亚洲 美腿 欧美 偷拍| 亚洲国产精品精华液ab| 成人精品视频在线播放| 丁香婷婷久久| 亚洲成av人乱码色午夜| 日本理论中文字幕| 亚洲午夜伦理| 国产欧美精品va在线观看| 成人午夜视频一区二区播放| 国产亚洲精品久| 轻点好疼好大好爽视频| 亚洲精品555| 亚洲国产中文字幕久久网| 91精彩刺激对白露脸偷拍| 一区二区三区中文| 国产成人av在线| av网站在线观看免费| 久久久精品一品道一区| 精品人妻人人做人人爽| 国产91亚洲精品久久久| 日韩精品在线观看网站| 免费三片在线播放| 老司机一区二区| 欧美精品一区二区视频 | 国内精品伊人久久久| 国内伊人久久久久久网站视频| 中文字幕1区2区3区| 99麻豆久久久国产精品免费| 国产香蕉一区二区三区| 91综合国产| 亚洲日本中文字幕免费在线不卡| 国产精久久久久久| 国产精品一区二区x88av| 亚洲黄色一区二区三区| 伊人久久视频| 日韩av在线天堂网| 日本三级黄色大片| 国产精品主播直播| 亚洲精品自在在线观看| 欧美大片1688| 国产丝袜精品第一页| 日本少妇毛茸茸高潮| 国产精品乡下勾搭老头1| 伊人色综合久久天天五月婷| 国产欧美在线观看免费| 国产亚洲欧洲在线| 精品久久久久久久久久久国产字幕| 99久久婷婷国产精品综合| 日产精品久久久久久久蜜臀| 国产精品免费精品自在线观看| 最新国产精品亚洲| 做爰视频毛片视频| 中文幕一区二区三区久久蜜桃| 久久婷婷国产91天堂综合精品| 国产一区日韩| 国产精品视频xxx| 免费a级人成a大片在线观看| 7777精品伊人久久久大香线蕉完整版 | 99久久免费国产| 国产网站免费在线观看| 亚州国产精品| 国产98色在线| av资源种子在线观看| 欧美色图第一页| 女人裸体性做爰全过| 理论电影国产精品| 欧美少妇在线观看| 国语一区二区三区| 81精品国产乱码久久久久久| 伦理片一区二区三区| 色视频欧美一区二区三区| 国产免费一区二区三区网站免费| 日韩高清不卡一区| 一区二区视频在线观看| 亚洲高清在线一区| 97在线免费观看| 精品电影在线| 欧美婷婷六月丁香综合色| 国产又色又爽又高潮免费| 狠狠色狠狠色合久久伊人| 成人毛片100部免费看| 全球av集中精品导航福利| 国产suv精品一区二区三区88区| 91最新在线| 欧美不卡一二三| 亚洲天堂视频网站| 国产精品国产自产拍高清av| 稀缺呦国内精品呦| 久久深夜福利| 四虎4hu永久免费入口| 久久狠狠久久| 国产欧美日韩免费| 欧美韩日亚洲| 国产午夜精品美女视频明星a级| 91精品人妻一区二区三区果冻| 亚洲一区中文在线| 久久久久久久久久久久久久久| 黄一区二区三区| 国产色一区二区三区| 国产一区二区观看| 波多野结衣久草一区| 惠美惠精品网| 欧美高清自拍一区| www视频在线观看免费| 欧美大胆一级视频| 懂色av蜜臀av粉嫩av喷吹| 一片黄亚洲嫩模| 美国黄色特级片| 不卡的av中国片| 亚洲欧美日韩精品一区| 久久狠狠婷婷| 成人污网站在线观看| 精品国产一区二区三区香蕉沈先生| 91精品国产高清久久久久久91裸体| 欧美大片免费观看网址| 欧美激情小视频| 乱人伦中文视频在线| 亚洲欧洲免费视频| 亚洲精品久久久久久动漫器材一区| 欧美午夜电影在线播放| 色网站在线播放| 一区二区三区美女视频| 黄色免费一级视频| 91麻豆精品在线观看| 中文字幕在线国产| 黄色精品一二区| 9l视频白拍9色9l视频| 久久av一区| 成人午夜精品久久久久久久蜜臀| 天天揉久久久久亚洲精品| 欧美日韩一区二区三区在线视频| 一区二区三区欧洲区| 成人午夜激情网| 777午夜精品电影免费看| 91国产美女视频| 黄色大片在线| 欧美高跟鞋交xxxxhd| dy888亚洲精品一区二区三区| 中文字幕精品网| 国产高清美女一级毛片久久| 精品五月天久久| 五月激情六月婷婷| 精品88久久久久88久久久| 午夜久久久久久噜噜噜噜| 欧美一区二区在线播放| 一级淫片免费看| 欧美日韩国产另类不卡| 欧美一级黄视频| 欧美视频一二三区| 一级久久久久久| 欧美在线播放高清精品| 国产一卡二卡三卡| 91黄色免费观看| 国产精品成人久久久| 欧美综合在线视频| 中国a一片一级一片| 欧美性做爰猛烈叫床潮| 特级西西444www高清大视频| 欧美性大战久久久久久久蜜臀| 亚洲精品久久久久久久蜜桃| 欧美午夜电影网| 国产免费无遮挡| 日韩精品一区二区三区中文精品| 亚洲爱情岛论坛永久| 精品国产精品网麻豆系列| 蜜臀av中文字幕| 国产婷婷97碰碰久久人人蜜臀| 久蕉依人在线视频| 最好看的2019年中文视频| 国产三级在线播放| 欧美韩日一区二区| 亚洲免费福利| 国产精品网红福利| 欧美影院在线| 国产自产在线视频一区| 国产欧美日韩在线观看视频| 亚洲7777| 欧美日韩国产成人精品| 免费无码毛片一区二三区| 久久xxxx精品视频| 中文av一区二区三区| 国产精品1区2区| 色噜噜在线观看| 中国av一区二区三区| 丁香花五月激情| 色综合天天视频在线观看| 一级淫片免费看| 亚洲白拍色综合图区| 成人免费高清在线播放| 久久国产精品视频| 日韩伦理在线一区| 国产日韩换脸av一区在线观看| 最新国产精品精品视频| 欧美日韩天天操| 一区二区电影| 日韩av一二三四| 国产mv日韩mv欧美| 少妇无套高潮一二三区| 一区二区三区中文在线| 69视频免费在线观看| 91麻豆精品国产91久久久更新时间 | 美女诱惑黄网站一区| 91女神在线观看| www激情久久| 曰本女人与公拘交酡| 色88888久久久久久影院野外 | 精品在线小视频| av毛片在线免费看| 国产福利视频一区| a看欧美黄色女同性恋| 影音先锋在线亚洲| 日欧美一区二区| 亚洲 欧美 日韩在线| 素人fc2av清纯18岁| 亚洲综合在线第一页| 中文字幕一区二区三区免费看| 亚洲精品99久久久久| gogogogo高清视频在线| 国产精品久久久久久久一区探花 | 精品一区精品二区| 在线免费av导航| 国产欧美精品在线播放| 九热爱视频精品视频| 欧日韩免费视频| 国产不卡视频在线播放| 朝桐光av在线| 欧美巨大另类极品videosbest | 色91精品久久久久久久久| 91在线看国产| 日韩久久精品视频| 日韩一级完整毛片| 含羞草www国产在线视频| 国产精品国产自产拍高清av水多| 亚洲动漫在线观看| 无码人妻少妇伦在线电影| 国产成人午夜电影网| 国产黄色小视频网站| 欧美精品乱人伦久久久久久| 91xxx在线观看| 国产精品欧美日韩久久| 精品大片一区二区| 男女爽爽爽视频| 国产亚洲欧美日韩日本| 久久久精品毛片| 亚洲一区二区黄| 久久国内精品| 一级做a爰片久久| 久久精品99国产精品| 日本一二三不卡视频| 欧美午夜精品久久久久久孕妇| 99中文字幕一区| 国产日韩欧美夫妻视频在线观看| 色综合天天爱| 在线视频一二区| 亚洲精品国产第一综合99久久 | 日韩黄色碟片| 中文视频一区视频二区视频三区| 久久激五月天综合精品| 五月综合色婷婷| 日韩你懂的电影在线观看| 日本欧美电影在线观看| 国产伦精品一区二区三区在线| 亚洲久久在线| 在线免费观看成年人视频| 色综合久久久久综合体桃花网| 国产黄色片在线播放| 国产免费一区视频观看免费 | 国产精品巨作av| 国产免费一区二区三区视频| 国产性做久久久久久| 一本到在线视频| 九九热最新视频//这里只有精品| 国产精品调教视频| 日韩av资源在线| 国产精品美女久久久久久久久| 国产人妻精品一区二区三区| 欧美国产日产韩国视频| 亚洲日本三级| www.99r| 亚洲成国产人片在线观看| 国产亚洲依依| 亚洲一区二区三区视频播放| 精品av久久久久电影| 亚洲日本精品视频| 欧美一区二区三区性视频| 麻豆免费在线| 亚洲欧洲精品一区二区| 国产成人在线视频网站| 中文字幕在线观看视频网站| 色妞久久福利网| 久久超级碰碰| 日本国产一级片| 精品日本高清在线播放| 97视频精彩视频在线观看| 国产精品免费在线| 蜜臀av一级做a爰片久久| 国产精品成人网站| 色哟哟亚洲精品一区二区| av成人男女| 视频免费1区二区三区| 精品久久久国产精品999|